pthread_cond_broadcast问题

kkkwdb 2011-01-05 04:51:08
我的程序代码如下:

pthread_mutex_t mymutex1 = PTHREAD_MUTEX_INITIALIZER;
12 pthread_mutex_t mymutex2 = PTHREAD_MUTEX_INITIALIZER;
13 pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;
14 void *mythread1(void *param)
15 {
16 pthread_mutex_lock(&mymutex1);
17 pthread_cond_wait(&mycond,&mymutex1);
18 fprintf(stderr,"this is mythread1.\n");
19 pthread_mutex_unlock(&mymutex1);
20 return NULL;
21 }
22 void *mythread2(void *param)
23 {
24 pthread_mutex_lock(&mymutex2);
25 pthread_cond_wait(&mycond,&mymutex2);
26 fprintf(stderr,"this is mythread2.\n");
27 pthread_mutex_unlock(&mymutex2);
28 return NULL;
29 }
30 int main(int argc,char* argv[],char *envp[])
31 {
32 int i;
33 pthread_t tid1,tid2;
34 pthread_create(&tid1,NULL,mythread1,NULL);
35 pthread_create(&tid2,NULL,mythread2,NULL);
36 getchar();
37 if(pthread_cond_broadcast(&mycond)){
38 printf("error\n");
39 return 1;
40 }
41 getchar();
42 printf("this is main thread.\n");
43 return 0;
44 }

结果只打印出了“this is mythread1”,为什么?
...全文
966 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxibaihuo 2011-02-27
  • 打赏
  • 举报
回复
主程序里在你的getchar()之后加一个sleep()延迟就可以了阿。
应该是你的主程序在发射信号的时候你的线程2还没有运行过pthread_cond_wait()造成的。
ayw215 2011-01-06
  • 打赏
  • 举报
回复
你join了么?
wickyboy 2011-01-06
  • 打赏
  • 举报
回复
楼主,推荐你好好看看 pthread_cond_broadcast pthread_cond_wait的man手册,网上有,上面有些地方说的非常清楚
wickyboy 2011-01-06
  • 打赏
  • 举报
回复
楼主,我给你发的英文你没有看啊?

你看了就会明白的,broadcast发送信号前,如果没有去显式地获取锁的话,如果这时发出条件变量信号,那么broadcast会去锁住需要调度的线程的锁并触发信号

cond_wait就会在信号唤醒之后试图获取到它之前获取到的锁,这时,由于cond_broadcast已经锁住了其中一个没有释放

就出现了只有一个wait能够获取到锁的情况了, 所以,有一个线程一定是阻塞在pthread_cond_wait函数上了

读读我给你发的英文就明白了哦, 楼主, 记得给我散分哦
kkkwdb 2011-01-06
  • 打赏
  • 举报
回复
多谢楼上两位,按照你们的观点试了试程序
(1) 按3楼说的pthread_cond_broadcast前后加锁,2个新线程中取得锁函数调用,程序正确执行,打印出:
this is mythread1和this is mythread2。
(2)2楼说只用一个mutex,在(1)中改的程序中把mutex2改为mutex1,则只打印出this is mythread1。
(3)我对原程序还有疑问,说说的的理解:
*程序执行到36行时,已经thread1和thread2开始运行,分别对mutex1和mutex2加锁,然后调用
pthread_cond_wait释放mutex,并阻塞等待信号。
*程序执行到41行时,thread1和thread2都受到了信号,于是pthread_cond_wait返回,并加锁,并把锁
交给原先加锁的线程,这里也就是自己。然后分别打印出this is mythread1和
this is mythread2。
*结果只打印了this is mythread1,理解哪错了?
wickyboy 2011-01-05
  • 打赏
  • 举报
回复
The pthread_cond_broadcast() or pthread_cond_signal() functions may be called by a thread whether or not it currently owns the mutex that threads calling pthread_cond_wait() or pthread_cond_timedwait() have associated with the condition variable during their waits; however, if predictable scheduling behavior is required, then that mutex shall be locked by the thread calling pthread_cond_broadcast() or pthread_cond_signal().
wickyboy 2011-01-05
  • 打赏
  • 举报
回复
如楼上所示,jointhread在主线程中是有必要调用的,不然主线程会提前退出。当然,我看到你用了getchar()阻塞主线程,这样也行,只是不好,建议不用。

楼主,主线程中的pthread_cond_broadcast前后需要加锁,如果不加锁会导致pthread_cond_broadcast将mutex1或者mutex2锁住而且不会释放,这样,就出现了你说的情况,只有“this is mythread1”

建议在broadcast前后加锁和释放锁。前面抓两个锁mutex1 mutex2, 后面释放两个锁mutex1 mutex2,这样应该就可以了,试试

ayw215 2011-01-05
  • 打赏
  • 举报
回复
join等待线程
另外你的mymutex2,mymutex1可以只用一个

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧