当前位置: 技术问答>linux和unix
pthread_cond_broadcast问题
来源: 互联网 发布时间:2016-11-09
本文导语: 我的程序代码如下: 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_...
我的程序代码如下:
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("errorn");
39 return 1;
40 }
41 getchar();
42 printf("this is main thread.n");
43 return 0;
44 }
结果只打印出了“this is mythread1”,为什么?
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("errorn");
39 return 1;
40 }
41 getchar();
42 printf("this is main thread.n");
43 return 0;
44 }
结果只打印出了“this is mythread1”,为什么?
|
楼主,我给你发的英文你没有看啊?
你看了就会明白的,broadcast发送信号前,如果没有去显式地获取锁的话,如果这时发出条件变量信号,那么broadcast会去锁住需要调度的线程的锁并触发信号
cond_wait就会在信号唤醒之后试图获取到它之前获取到的锁,这时,由于cond_broadcast已经锁住了其中一个没有释放
就出现了只有一个wait能够获取到锁的情况了, 所以,有一个线程一定是阻塞在pthread_cond_wait函数上了
读读我给你发的英文就明白了哦, 楼主, 记得给我散分哦
你看了就会明白的,broadcast发送信号前,如果没有去显式地获取锁的话,如果这时发出条件变量信号,那么broadcast会去锁住需要调度的线程的锁并触发信号
cond_wait就会在信号唤醒之后试图获取到它之前获取到的锁,这时,由于cond_broadcast已经锁住了其中一个没有释放
就出现了只有一个wait能够获取到锁的情况了, 所以,有一个线程一定是阻塞在pthread_cond_wait函数上了
读读我给你发的英文就明白了哦, 楼主, 记得给我散分哦
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。