2012-04-21 64 views
2

我有这个简单的互斥锁/等待等待类包装的问题。 我用它来保护连接的客户端的队列,并在等待状态,有连接新客户通知线程,但应用与分割在互斥锁等待类错误或错误

client_socket_fd = clients_for_threads_q.front(); 

失败坠毁时,其正在只是压力测试(很多客户端连接)

在线程等待:ptotected上书写

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的

回答

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

喔,谢谢,我打破了我的大脑! :) – abrahab 2012-04-21 23:41:02