一般来说, pthread_cond_wait()
和pthread_cond_signal()
被称为如下:
//thread 1:
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
do_something()
pthread_mutex_unlock(&mutex);
//thread 2:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
步骤如下
pthread_cond_wait(&cond, &mutex);
被调用,它解锁互斥量
线程2锁定互斥锁,并调用pthread_cond_signal()
它解锁互斥量
在线程1, pthread_cond_wait()
被调用,并再次锁定互斥
现在,在线程2,后pthread_cond_signal()
被调用, pthread_mutex_unlock(&mutex)
将运行,在我看来它要解锁现在被线程1锁定这有什么错在我的理解互斥?
此外,它还在我看来, pthread_cond_wait()
只能由1相同COND-互斥对线程调用。 但有一种说法“的调用pthread_cond_signal()函数将解锁被阻挡在指定条件变量COND其(如果有的话线程被阻塞上COND)的螺纹中的至少一个”。 因此,这意味着pthread_cond_wait()
可以通过多个线程对同一COND-互斥对被称为?
pthread_cond_signal
不会解锁互斥(?它不能因为它没有参考互斥体,所以它怎么会知道开锁的)事实上,信号不必为互斥的任何连接; 信令线程并不需要持有互斥体,虽然基于条件变量它将大多数算法。
pthread_cond_wait
解锁它睡觉之前(如你注意到)的互斥体,但随后reaquires互斥(这可能需要等待),当它发出信号,它醒来之前。 因此,如果信令线程持有互斥体(通常情况下),等待的线程将不会继续进行,直到信号线也解锁互斥量。
条件瓦尔常见的用途是一样的东西:
thread 1:
pthread_mutex_lock(&mutex);
while (!condition)
pthread_cond_wait(&cond, &mutex);
/* do something that requires holding the mutex and condition is true */
pthread_mutex_unlock(&mutex);
thread2:
pthread_mutex_lock(&mutex);
/* do something that might make condition true */
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
两个线程具有互斥被保护访问某些共享数据结构。 第一个线程要等待,直到某个条件为真,则立即做一些操作(无竞争状态的机会,其他线程的状态检查和行动之间进来,使病情假。)第二个线程正在做的事情可能使病情真,所以它需要唤醒任何人,可能是在等待它。
下面是一个典型的例子: 线程1正在等待的状态下,其可以通过螺纹2被满足 。
我们用一个互斥和一个条件。
pthread_mutex_t mutex;
pthread_cond_t condition;
线程1:
pthread_mutex_lock(&mutex); //mutex lock
while(!condition){
pthread_cond_wait(&condition, &mutex); //wait for the condition
}
/* do what you want */
pthread_mutex_unlock(&mutex);
线程2:
pthread_mutex_lock(&mutex);
/* do something that may fulfill the condition */
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition); //wake up thread 1
编辑
正如你可以在看到调用pthread_cond_wait手册 :
它以原子方式释放互斥并且使得调用线程阻塞条件变量COND; 原子在这里是指“原子相对于由另一个线程访问互斥,然后条件变量”。