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 | |