c++原子/互斥对象该怎么做?
C++ Atomic/Mutex What way to follow?
我想知道什么是更好的选择:它假设有一个平凡的可复制对象,让我们说一个队列数据结构,这是由几个线程来弹出/推送数据。对象只提供put/push方法,不能被多个线程同时访问。显然,如果调用了put,也不能调用push。
您是否建议将模型包装成原子类型(如果可能的话),或者更确切地说使用互斥体?
问候!
原子是硬件的事情,而互斥是操作系统的事情。互斥锁将以挂起任务结束,即使在某些情况下互斥锁将在短时间内表现为自旋锁,也称为"乐观自旋",参见https://lore.kernel.org/all/56C2673F.6070202@hpe.com/T/所以,如果你有一些小的操作,比如增加一个变量,又名"原子",而不需要等待其他可能需要更长时间的操作,那么"原子"就是为你准备的。如果您想(无限期地)等待其他线程中发生的某些事情,通过原子(又名自旋锁)轮询结果可能会浪费CPU周期,因此不太合作,因此最好使用互斥锁/条件变量,这会以上下文切换延迟为代价挂起任务。
Atomic更适合这些情况。原子操作是一种由CPU专门支持的操作,而其他类型的线程控制往往由操作系统或其他措施实现,并且会产生更多的开销。
编辑:一个快速搜索显示这有更多的信息,基本上是相同类型的问题:哪个更有效,基本互斥锁或原子整数?编辑2:在这里有更详细的文章http://www.informit.com/articles/article.aspx?p=1832575相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- 值初始化是否适用于原子对象?
- 原子对象在普通对象安全的任何上下文中都是不安全的
- 海湾合作委员会中易于复制类型的原子对象
- 取消引用指向不同线程中的原子对象的只读非原子指针是否安全
- 复制包含原子成员的对象的地址
- 原子类对象方法用法
- 执行 c++ 11 原子对象也是原子的吗?
- c++中的原子指针以及在线程之间传递对象
- 如何编写安全的原子对象包装器?
- c++原子对象锁自由保证
- c++原子/互斥对象该怎么做?
- 非原子对象在所有线程中都有相同的修改顺序吗?(在没有数据竞赛的情况下)
- 如果没有在互斥对象下修改共享原子变量,则不能正确发布