我对pthread_cond_wait和pthread_cond_signal函数有疑问。阅读完手册之后我也无法理解。
请考虑以下代码。
void* thread_handler(){
... // counts till COUNT_LIMIT is reached
if (count == COUNT_LIMIT) {
pthread_cond_signal(&count_threshold_cv);
printf("inc_count(): thread %ld, count = %d Threshold reached.\n",
my_id, count);
}
printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",
my_id, count);
...
}
void* thread_handler1(){
... // waits till the previous thread has finished counting
pthread_mutex_lock(&count_mutex);
while (count<COUNT_LIMIT) {
pthread_cond_wait(&count_threshold_cv, &count_mutex);
printf("watch_count(): thread %ld Condition signal received.\n", my_id);
}
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}
代码按预期工作。我想了解代码。以下是该程序的工作原理
输入thread_handler1并执行cond_wait。从手册页中我了解到cond_wait将立即以原子方式释放锁。 那么为什么他们会在thread_handler1下面再次发布锁定
在第一个线程满足条件并且命中条件信号之后,我期望阻塞的线程执行其步骤。相反,我得到了执行cond_signal的线程下面的printfs。为什么会发生这种情况
总体而言,为什么我们需要在等待和发信号之前锁定。不能没有锁定就可以完成。
如需简要了解该计划,请参阅此处的Complete program。您可以在&#34;使用条件变量&#34;
部分找到它提前致谢
奇丹巴拉姆
答案 0 :(得分:2)
输入thread_handler1并执行cond_wait。从我理解的手册页 cond_wait将立即以原子方式释放锁。那么为什么呢 他们在thread_handler1下面再次释放锁定
因为应该等待的线程在调用wait
时释放锁定,但是在它发出信号后(当它变为可用时)将重新获取。这就是为什么你需要稍后明确重新发布它。
第一个线程满足条件并达到条件后 信号我期望阻塞的线程执行其步骤。 相反,我得到了执行该线程的线程下面的printfs cond_signal。为什么会发生这种情况
因为调用signal
不会从CPU切换线程。它将继续正常运行。