在阅读了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...
因此,当初学者和工作者都在等待时,只有一个或另一个得到信号,但从来没有。当启动器存在时,工人总是得到信号。如果规范为:一个且只有一个线程将被解除阻塞,您会期望这种行为,但它会说至少一个,所以是否有更多的情况一个线程可以被解除阻塞吗?
这可能是我在这里谈论的一个边缘案例,但我想了解这意味着什么。例如,如果我想让一个线程队列等待同一个事件,那么我需要确保只有一个线程接收信号......