c++ - 简单的互斥保护队列与 C++ 中的线程安全队列
问题描述
我想在我的程序中使用一个简单的线程安全 std::queue,它有多个线程访问同一个队列。我想到的第一件事是使用互斥锁保护队列操作,如下所示:
/*Enqueue*/
mutex.lock();
queue.push();
mutex.unlock();
/*Dequeue*/
mutex.lock();
val = queue.front
mutex.unlock();
/*some operation*/
mutex.pop();
我已经看到许多使用条件变量进行线程安全队列实现的强大实现,例如https://stackoverflow.com/a/16075550/3598205。如果我只有两个线程访问同一个队列,性能会有显着差异吗?
解决方案
互斥锁和条件变量做两种不同的事情,尽管它们经常一起使用。
要确保一次只有一个线程可以访问资源,请使用互斥锁。您发布的代码显示了一个示例。
要阻塞一个工作线程直到它有事情要做,让它等待一个条件变量(然后由另一个提供某种工作项的线程发出信号)。在cppreference有一个例子。
编写多线程代码时,您的第一个想法应该是编写健壮、安全的代码。很容易出错,特别是如果您是该领域的新手,而且错误很难诊断,因为它们会导致零星的、不可预测的错误。以后担心性能。
推荐阅读
- python - Pytorch RuntimeError:大小不匹配,m1:[1 x 7744],m2:[400 x 120]
- reactjs - 无法在 onClick 中读取“someFunction”的 null 属性“someFunction”
- java - 如何计算这些重复的整数?
- momentjs - 一时误会 utcOffset
- javascript - jQuery 单选按钮事件
- sql - Apex 身份验证包
- python - 在一个 GPU 上多线程处理两个不同的神经网络是否有意义?
- jquery - 使用 jquery ajax 替换视图部分
- angular - 具有多个组件的 Angular LazyLoading 不起作用
- reactjs - typescript react - 定义元素名称锚的类型 - TS2559