c++原子/互斥对象该怎么做?

C++ Atomic/Mutex What way to follow?

本文关键字:对象 原子 c++      更新时间:2023-10-16

我想知道什么是更好的选择:它假设有一个平凡的可复制对象,让我们说一个队列数据结构,这是由几个线程来弹出/推送数据。对象只提供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