首页  >  文章  >  后端开发  >  为什么我的 C 11 线程安全队列在从空队列出队时出现段错误?

为什么我的 C 11 线程安全队列在从空队列出队时出现段错误?

Linda Hamilton
Linda Hamilton原创
2024-10-30 20:34:02785浏览

Why Does My C  11 Thread-Safe Queue Segfault When Dequeuing from an Empty Queue?

带条件变量的 C 11 线程安全队列实现

问题:

在实现线程安全队列时,从空队列中出队时发生段错误。该问题源于条件变量 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,从而防止尝试从空队列中出队。

其他建议:

  • 使用可重用线程安全队列的模板。
  • 在类的构造函数中初始化队列,而不是内联
  • 避免使用 std::lock_guard 而使用 std::unique_lock,因为这可以确保即使在临界区内抛出异常,互斥体也能解锁。

以上是为什么我的 C 11 线程安全队列在从空队列出队时出现段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn