问题:
在实现线程安全队列时,从空队列中出队时发生段错误。该问题源于条件变量 wait_for 函数,该函数预计仅在收到通知时才返回。然而,wait_for函数返回cv_status::no_timeout后,队列有时仍为空。
解决方案:
正确的做法是反转条件监控的条件多变的。在这种情况下,q.empty() 应反转为 !q.empty(),因为所需的条件是队列至少有一个元素。下面是修改后的出队方法:
<code class="cpp">std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout) { std::unique_lock<std::mutex> lock(qMutex); while (q.empty()) { if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::timeout) { return std::string(); } } std::string ret = q.front(); q.pop(); return ret; }</code>
现在,如果队列在超时时间后仍为空,wait_for 函数将仅返回 cv_status::timeout,从而防止尝试从空队列中出队。
其他建议:
以上是为什么我的 C 11 线程安全队列在从空队列出队时出现段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!