互斥 cond 等待类错误或错误

mutex cond wait class error or bug

本文关键字:错误 等待 cond 互斥      更新时间:2023-10-16

我对互斥体/cond wait类的这个简单包装器有问题。我使用它来保护已连接客户端的队列,并通知处于等待状态的线程有新客户端连接,但应用程序崩溃,分段失败

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();

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