由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教pthread producer-consumer问题
相关主题
Re: 一道count frequency of all words的面试题 (转载)两个继承问题
how to statically initialze a mutex in class?question about c++ constructor
Is it possible to initialize container in initialization list?前几天有人问rvalue reference的
pthread_create inside a constructor求教一个Java问题 IllegalMonitorStateException
再问C++初始化问题。给大家出个多进程的题
问个char*的问题does the system guarantee this? (转载)
double-checked lockingEBUSY 的定义
is pthread_mutex_destroy() required to call?c++问题
相关话题的讨论汇总
话题: pthread话题: mutex话题: sem话题: producer话题: consumer
进入Programming版参与讨论
1 (共1页)
A**u
发帖数: 2458
1
照书编了一个,
结果总是不对,请大牛看看问题出在哪里呢
#include
#include
#include
pthread_mutex_t region_mutex = PTHREAD_MUTEX_INITIALIZER;
sem_t items;
int b; /* buffer size = 1; */
void add_buffer(int i){
b = i;
}
int get_buffer(){
return b ;
}
void *producer(void*)
{
int i = 0;
std::cout <<"I'm a producer" << std::endl;
while (1) {
pthread_mutex_lock(®ion_mutex);
add_buffer(i);
pthread_mutex_unlock(®ion_mutex);
sem_post(&items);
i = i + 1;
}
return 0;
}
void *consumer(void*)
{
int i,v;
std::cout <<"I'm a consumer" << std::endl;
for (i=0;i<100;i++) {
sem_wait(&items);
pthread_mutex_lock(®ion_mutex);
v = get_buffer();
pthread_mutex_unlock(®ion_mutex);
std::cout <<"got " << v << std::endl;
}
return 0;
}
int main()
{
pthread_t producer_thread;
pthread_t consumer_thread;
sem_init(&items,0,0);
pthread_create(&consumer_thread,0,consumer,0);
pthread_create(&producer_thread,0,producer,0);
pthread_join(consumer_thread,0);
pthread_join(producer_thread,0);
}
结果是
I'm a consumer
got 0
got 0
got 0
got 0
got 0
got 0
got 0
got 0
got 0
got 0
I'm a producer
这很让我费解, items初始为0,
sem_wait(&items);
难道不是block consumer_thread了吗?
A**u
发帖数: 2458
2
我又测试了下面的例子
#include
#include
#include
#include
#include
using std::cout;
using std::endl;
sem_t sem;
void* fun(void*){
while( true ){
sem_wait(&sem);
cout << "Hello " << endl;
}
return 0;
}
int main(){
pthread_t ID;
int res = sem_init(&sem,1,0);
if (res == -1)
{
cout << "sem failed" << endl;
cout << errno << endl;
return 0;
}
pthread_create(&ID,0,fun,0);
while( true ){
cout << " main " << endl;
sem_post(&sem);
}
return 0;
}
返回是
sem failed
78
我的系统上 errno 78 是
#define ENOSYS 78 /* Function not implemented */
请大牛看看,什么原因
t****t
发帖数: 6806
3
你这个显然不对, producer可以一直跑不带停的.

【在 A**u 的大作中提到】
: 照书编了一个,
: 结果总是不对,请大牛看看问题出在哪里呢
: #include
: #include
: #include
: pthread_mutex_t region_mutex = PTHREAD_MUTEX_INITIALIZER;
: sem_t items;
: int b; /* buffer size = 1; */
: void add_buffer(int i){
: b = i;

t****t
发帖数: 6806
4
你什么系统, 不带semaphore的? 20年前的DOS吗?

【在 A**u 的大作中提到】
: 我又测试了下面的例子
: #include
: #include
: #include
: #include
: #include
: using std::cout;
: using std::endl;
: sem_t sem;
: void* fun(void*){

M**********n
发帖数: 432
5
This is interesting.
My result is different but valid every time when I ran it. For thread
application, the results could be unpredictable. It looks like you producer
thread is blocked in the second loop waiting for the mutex while the
consumer continues acquiring mutex and print results.

【在 A**u 的大作中提到】
: 照书编了一个,
: 结果总是不对,请大牛看看问题出在哪里呢
: #include
: #include
: #include
: pthread_mutex_t region_mutex = PTHREAD_MUTEX_INITIALIZER;
: sem_t items;
: int b; /* buffer size = 1; */
: void add_buffer(int i){
: b = i;

A**u
发帖数: 2458
6
多谢大牛回复
我用的mac gcc
这么编译的 gcc main.cpp

【在 t****t 的大作中提到】
: 你什么系统, 不带semaphore的? 20年前的DOS吗?
A**u
发帖数: 2458
7
谢谢
问题找到了,是
sem_init()初始化不成功,
但为什么不成功呢

producer

【在 M**********n 的大作中提到】
: This is interesting.
: My result is different but valid every time when I ran it. For thread
: application, the results could be unpredictable. It looks like you producer
: thread is blocked in the second loop waiting for the mutex while the
: consumer continues acquiring mutex and print results.

M**********n
发帖数: 432
8
try to recompile with g++ t.cpp -lrt or -pthread

【在 A**u 的大作中提到】
: 谢谢
: 问题找到了,是
: sem_init()初始化不成功,
: 但为什么不成功呢
:
: producer

A**u
发帖数: 2458
9
mac下没有lrt
我用rt代替,
还是一样, semaphore初始化出错

【在 M**********n 的大作中提到】
: try to recompile with g++ t.cpp -lrt or -pthread
p***o
发帖数: 1252
10
Unbelievable!
http://stackoverflow.com/questions/1413785/sem-init-on-os-x

【在 t****t 的大作中提到】
: 你什么系统, 不带semaphore的? 20年前的DOS吗?
M**********n
发帖数: 432
11
"我的系统上 errno 78 是
#define ENOSYS 78 /* Function not implemented */"
According to your own post, "Function not imoplemented" on your MAC OS.

【在 A**u 的大作中提到】
: mac下没有lrt
: 我用rt代替,
: 还是一样, semaphore初始化出错

A**u
发帖数: 2458
12
好吧。。。太谢谢你了。

【在 M**********n 的大作中提到】
: "我的系统上 errno 78 是
: #define ENOSYS 78 /* Function not implemented */"
: According to your own post, "Function not imoplemented" on your MAC OS.

A**u
发帖数: 2458
13
太好了。

【在 p***o 的大作中提到】
: Unbelievable!
: http://stackoverflow.com/questions/1413785/sem-init-on-os-x

1 (共1页)
进入Programming版参与讨论
相关主题
c++问题再问C++初始化问题。
pthread in cygwin问个char*的问题
waiting for N condition variables in linuxdouble-checked locking
condional variable thread sync 问题 (转载)is pthread_mutex_destroy() required to call?
Re: 一道count frequency of all words的面试题 (转载)两个继承问题
how to statically initialze a mutex in class?question about c++ constructor
Is it possible to initialize container in initialization list?前几天有人问rvalue reference的
pthread_create inside a constructor求教一个Java问题 IllegalMonitorStateException
相关话题的讨论汇总
话题: pthread话题: mutex话题: sem话题: producer话题: consumer