互斥cond等待类错误或错误

时间:2012-04-21 23:08:37

标签: c++ multithreading pthreads

我对这个简单的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();

1 个答案:

答案 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();
}