- 论坛徽章:
- 5
|
不同于信号量,条件变量没有计数值,也不占据内存空间,线程 A 必须在 B 发送信号之前开始等待。如果 B 在 A 执行等待操作之前发送了信号,这个信号就丢失了,同时 A会一直阻塞直到其它线程再次发送信号到这个条件变量。
在帖子上看到了上面这段好,这个信号丢失指的是什么?
是指B发送信号时,A为处于等待状态,那么A会死等,直到下一个信号发送?
有个小例子如下- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <pthread.h>
- pthread_cond_t qready = PTHREAD_COND_INITIALIZER; //初始构造条件变量
- pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; //初始构造锁
- pthread_t tid1,tid2,tid3;
-
- int x = 10;
- int y = 20;
-
-
- void *thrd_1(void *arg)
- {
- sleep(5);
- pthread_mutex_lock(&qlock);
- while(x<y)
- {
- pthread_cond_wait(&qready,&qlock);
- }
- pthread_mutex_unlock(&qlock);
- printf("1\n");
- sleep(1);
- }
- void *thrd_2(void *arg)
- {
- pthread_mutex_lock(&qlock);
- x = 20;
- y = 10;
- printf("Has change x and y\n");
- pthread_mutex_unlock(&qlock);
- if(x > y)
- {
- pthread_cond_signal(&qready);
- }
- printf("2\n");
- }
-
- void *thrd_3(void *arg)
- {
- pthread_join(tid1,NULL);
- printf("3\n");
- }
- int main(int argc,char **argv)
- {
- int err;
- err = pthread_create(&tid1,NULL,thrd_1,NULL);
- if(err != 0)
- {
- printf("pthread 1 create error\n");
- }
- err = pthread_create(&tid2,NULL,thrd_2,NULL);
- if(err != 0)
- {
- printf("pthread 2 create error\n");
- }
- err = pthread_create(&tid3,NULL,thrd_3,NULL);
- if(err != 0)
- {
- printf("pthread 3 create error\n");
- }
- while(1)
- {
- sleep(1);
- }
- return 0;
- }
复制代码 但执行结果却是:
Has change x and y
2
1
3
|
|