互斥 cond 等待类错误或错误
mutex cond wait class error or bug
我对互斥体/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();
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 尝试等待 boost::condition_Variable 时出现"unique_lock has no mutex: Operation not permitted"错误
- 互斥 cond 等待类错误或错误
- 在纯虚拟类的析构函数中等待线程死亡会导致运行时错误
- C++管道错误,管道永远等待
- Data_condition等待无效参数错误
- 等待线程关闭时Boost互斥抛出错误