我对这个简单的mutex / cond等待包装有问题。 我使用它来保护已连接客户端的队列,并通知处于等待状态的线程已连接新客户端,但应用程序崩溃且分段失败
client_socket_fd = clients_for_threads_q.front();
当它仅在压力测试下(许多客户连接)
等待线程:
MUTEXCONDSIGNAL_for_workers.lock();
if ( clients_for_threads_q.empty() )
{
MUTEXCONDSIGNAL_for_workers.wait_signal();
}
client_socket_fd = clients_for_threads_q.front(); // CRASHED !!!!
clients_for_threads_q.pop();
MUTEXCONDSIGNAL_for_workers.unlock();
当然,clients_for_threads_q在写作时受到了保护
MUTEXCONDSIGNAL_for_workers.lock();
clients_for_threads_q.push (client_socket_fd);
MUTEXCONDSIGNAL_for_workers.send_signal();
MUTEXCONDSIGNAL_for_workers.unlock();
答案 0 :(得分:4)
pthread_cond_wait
可能有虚假的唤醒。
使用条件变量时,总会有一个布尔谓词,涉及与每个条件等待关联的共享变量,如果线程应该继续,则为true。 可能会发生pthread_cond_wait()或pthread_cond_timedwait()函数的虚假唤醒。由于从pthread_cond_wait()或pthread_cond_timedwait()返回并不意味着有关此谓词的值的任何内容,因此应在返回时重新评估谓词。
您需要将服务员if
条件更改为循环:
while ( clients_for_threads_q.empty() )
{
MUTEXCONDSIGNAL_for_workers.wait_signal();
}