1

我对 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);
}

该代码按预期工作。我正在尝试理解代码。这是程序的工作原理

  1. 输入 thread_handler1 并执行 cond_wait。从手册页我了解到 cond_wait 将立即以原子方式释放锁。那么为什么他们在thread_handler1下面再次释放锁

  2. 在第一个线程满足条件并达到条件信号后,我期望阻塞的线程执行其步骤。相反,我在执行 cond_signal 的线程下面得到了 printfs。为什么会这样

  3. 总的来说,为什么我们需要在等待和发出信号之前锁定。没有锁就不能做到这一点。

有关该程序的简要介绍,请参阅此处的完整程序。您可以在“使用条件变量”部分找到它

提前致谢

奇丹巴拉姆

4

1 回答 1

2

输入 thread_handler1 并执行 cond_wait。从手册页我了解到 cond_wait 将立即以原子方式释放锁。那么为什么他们在thread_handler1下面再次释放锁

因为应该等待的线程将在调用时释放锁wait,但在收到信号后(当它变得可用时)会重新获取。这就是为什么您需要稍后明确地重新发布它。

在第一个线程满足条件并达到条件信号后,我期望阻塞的线程执行其步骤。相反,我在执行 cond_signal 的线程下面得到了 printfs。为什么会这样

因为调用signal不会从 CPU 切换线程。它将继续正常运行。

于 2012-10-26T13:02:44.430 回答