在pthread等待之前,我们使用互斥锁进行锁定,以便其他一些代码可能不会尝试更改条件变量。等待然后解锁互斥锁并等待信号。
说,在其他一些线程中,我锁定了相同的互斥锁,之后,我使用了'信号'。然后解锁线程。 当信号完成时,等待的线程唤醒并再次获取互斥锁。
Thread1 Thread2
{ {
lock(mutex); lock(mutex);
wait(mutex); signal(mutex);
unlock(mutex); unlock(mutex);
} }
假设三个线程中的一个语句包含在while(1)循环中。然后假设thread2锁定互斥锁,发信号并解锁互斥锁。然后不会结束,而是进入睡眠状态。
条件变量的值是否会永久更改?如果第一个线程的三个语句在无限的lop中运行,它是否永远不会等待,只是发现信号已被给出?当等待调用返回时,它是否将条件变量的值设置回初始值?
如果是,我可以对变量使用create,destroy或initialize方法来设置值吗?如果有,怎么样?这些功能到底是做什么的?
谢谢,
答案 0 :(得分:0)
pthread_cond_signal()
将始终唤醒至少一个当前等待pthread_cond_wait()
中该条件变量的线程。如果同一个线程或另一个线程再次调用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);
}
你可以在这里看到当条件是"重置"完全由您控制 - 例如,您可以Thread 1
设置flag = 0;
,然后才能调用pthread_mutex_unlock()
。
共享状态通常比简单标志更复杂 - 例如,您可能有一个生产者线程调用pthread_mutex_wait()
,而共享缓冲区中没有空间。