pthread_cond_signal - 当一个线程等待的时间越多,会发生什么?

时间:2014-09-25 12:04:31

标签: c++ pthreads

在阅读了c ++标准之后,我仍然有点不清楚当条件上有多个线程被阻塞时会发生什么,第三个线程会发出信号。

来自规范:

  

pthread_cond_signal()函数应取消阻止至少一个   在指定条件变量cond上阻塞的线程(如果   任何线程都被cond阻止了。

     

如果在条件变量上阻塞了多个线程,则   调度策略应确定线程的顺序   畅通。

这里至少有一个......但这究竟意味着什么? - 一个且只有一个,或者一些未定义的线程数至少有一个?

我测试了3个线程(只显示主循环): 注意:这是毫无意义的代码,我只是用它来学习,我知道我可以使用 pthread_cond_broadcast(),但我只是想先完全理解pthread_cond_signal()

自动收报机主题:递增'计数器'并发出'tickOccured'信号,即'计数器'已更改

while (1)
{
   // Get the mutex
   pthread_mutex_lock(&mutex);

   counter++;

   std::cout << "\t\t ticker: " << counter << std::endl;

   // Tell others that a tick has occured
   pthread_cond_signal(&tickOccured);

   // Release
   pthread_mutex_unlock(&mutex);

   sleep(1);
}

工作线程检查'counter'的值,并通过设置标志'closeStarter'确定thread3是否应该结束

while (1)
{
   // Get the mutex
   pthread_mutex_lock(&mutex);

   // Wait for a tick
   std::cout << "\t\t\t\t waiting..." << std::endl;
   pthread_cond_wait(&tickOccured, &mutex);

   std::cout << "\t\t\t\t worker: " << counter << std::endl;

   // Check if its time to end the starter
   if (counter >= TIME_FOR_STARTER_TO_EXIT)
   {
      // Set close starter flag
      closeStarter = true;
   }

   // Release
   pthread_mutex_unlock(&mutex);
}

起始线程检查标志'closeStarter'及其真正退出

// Monitor things for a while and then exit when its time
while (!closeStarter)
{
   // Get the mutex
   pthread_mutex_lock(&mutex);

   std::cout << "Starter: waiting..." << std::endl;
   pthread_cond_wait(&tickOccured, &mutex);

   std::cout << "Starter: " << counter << std::endl;

   // Release
   pthread_mutex_unlock(&mutex);
}

std::cout << "Starter: Exiting..." << std::endl;
pthread_exit(NULL);

结果: 我观察到的是

Starter: Starting...
           ticker: Starting...
           ticker: 1
                     worker: Starting...
Starter: waiting...
                     worker: waiting...
           ticker: 2
Starter: 2
Starter: waiting...
           ticker: 3
                     worker: 3
                     worker: waiting...
           ticker: 4
Starter: 4
Starter: waiting...
           ticker: 5
                     worker: 5
                     worker: waiting...
           ticker: 6
Starter: 6
Starter: Exiting...
           ticker: 7
                     worker: 7
                     worker: waiting...
           ticker: 8
                     worker: 8
                     worker: waiting...
           ticker: 9
                     worker: 9
                     worker: waiting...

因此,当初学者和工作者都在等待时,只有一个或另一个得到信号,但从来没有。当启动器存在时,工人总是得到信号。如果规范为:一个且只有一个线程将被解除阻塞,您会期望这种行为,但它会说至少一个,所以是否有更多的情况一个线程可以被解除阻塞吗?

这可能是我在这里谈论的一个边缘案例,但我想了解这意味着什么。例如,如果我想让一个线程队列等待同一个事件,那么我需要确保只有一个线程接收信号......

0 个答案:

没有答案