在pthread等待之前,我们使用互斥锁,这样其他代码就不会尝试更改条件变量。等待,然后解锁互斥锁并等待信号。
比方说,在其他线程中,我锁定了相同的互斥锁,在那之后,我使用了“signal”。然后解锁线程。当信号完成时,等待的线程唤醒并再次获取互斥锁。
Thread1 Thread2
{ {
lock(mutex); lock(mutex);
wait(mutex); signal(mutex);
unlock(mutex); unlock(mutex);
} }假设三个线程一语句被封装在一个while(1)循环中。然后假设thread2锁定互斥锁,给它发信号,然后解锁互斥锁。然后并没有结束,而是进入了睡眠状态。
那么条件变量的值会永久改变吗?如果线程1的三个语句在无限lop中运行,它是否永远不会等待,只会发现信号已经给出?当等待调用返回时,是否将条件变量的值设置回初始值?
如果是,我是否可以在变量上使用create、destroy或initialize方法来重新设置值?如果是,是如何实现的?这些函数到底是做什么的?
谢谢,
发布于 2012-07-30 13:52:17
在pthread_cond_wait()中,pthread_cond_signal()将始终唤醒至少一个当前正在等待该条件变量的线程。如果相同的线程或不同的线程再次调用pthread_cond_wait(),它将阻塞并等待另一个信号。
这意味着pthread条件变量必须始终与某种类型的共享数据配对,并受调用pthread_cond_wait()时持有的互斥保护。在调用pthread_cond_wait()之前,线程必须检查共享数据,看看它想要等待的条件是否已经发生-如果没有,就不应该等待。
这种共享数据的最简单示例可能是全局标志。在您的示例中:
int flag = 0;
Thread 1 {
pthread_mutex_lock(&mutex);
while (!flag)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}
Thread 2 {
pthread_mutex_lock(&mutex);
flag = 1;
pthread_mutex_signal(&cond);
pthread_mutex_unlock(&mutex);
}您可以在这里看到,当条件为"reset“时,完全由您控制-例如,您可以在Thread 1调用pthread_mutex_unlock()之前将其设置为flag = 0;。
共享状态通常比简单的标志更复杂-例如,当共享缓冲区中没有空间时,您可能有一个生产者线程调用pthread_mutex_wait()。
https://stackoverflow.com/questions/11682588
复制相似问题