C 11 线程安全队列:理解和调试
您在线程安全队列实现中遇到分段错误dequeue() 函数,特别是当队列为空时。出现此异常的原因是您的等待条件 wait_for(lock, timeout) 的结构不正确,无法处理虚假唤醒。
了解虚假唤醒
条件变量像 populatedNotifier 一样,可能会遇到虚假唤醒,即在没有发生任何实际通知的情况下唤醒它们。此行为是底层多线程实现中固有的,并且可能是不可预测的。
更正条件
为了避免依赖可能不可靠的通知,最佳实践要求使用相反的方法所需的条件作为 dequeue() 和类似函数中 while 循环的基础:while (!condition)。在此循环中:
示例实现
这里是修订版dequeue() 函数的版本:
std::unique_lock<:mutex> lock(qMutex);
while (q.empty()) {
c.wait(lock);
if (q.empty()) { // Immediately check the condition again after acquiring the lock
return std::string();
}
}
std::string ret = q.front();
q.pop();
return ret;
通过遵循这些准则,您可以确保等待条件稳健且不易受到虚假唤醒的影响,从而有效解决分段错误问题。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3