- 论坛徽章:
- 0
|
pthread_cond_signal()的具体位置?
"pthread_cond_signal()必须要放在pthread_mutex_lock() 和pthread_mutex_unlock() 之间, "
这个做法有个问题,举个例子
简单假设线程1、2,curnum 值为 1, 语句执行顺序如下:
-
- T2-->;pthread_mutex_lock(&mutex_curnum);
- T2-->;while(curnum)
- T2-->; pthread_cond_wait(&cond_curnum,&mutex_curnum);/*T2解锁,睡眠,等信号*/
- T1-->;pthread_mutex_lock(&mutex_curnum); /*轮T1运行,T1上锁*/
- T1-->;if (!--curnum) /*条件成立*/
- T1-->; pthread_cond_signal(&cond_curnum); /*T1向线程T2发信号*/
- T2-->;pthread_cond_wait(&cond_curnum,&mutex_curnum); /*T1时间片用完,换T2执行,但发觉不能上锁,因为T1持有锁*/
- T1-->;pthread_mutex_unlock(&mutex_curnum); /*T1解锁*/
复制代码
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题在于一个条件变量和一个互斥锁关联,
一个线程在持有锁的情况下调用pthread_cond_signal(),
则等待条件的线程有可能得不到锁。
就上面的特定例子来,配合每条语句的执行顺序,
虽然T1调用了pthread_cond_signal(), 但是T2 100%不能获得锁。
《UNIX网络编程第2卷:进程间通信》提了一个改进方法
- pthread_mutex_lock();
- 判断是否别个线程等待的条件发生,是的话设 "发生标志" 为 "是";
- pthread_mutex_unlock();
- if (发生标志 == 是)
- {
- pthread_cond_signal(...);
- }
复制代码 |
|