C++ 何时不使用原子操作?

C++ 何时不使用原子操作?,c++,c,multithreading,atomic,atomicity,C++,C,Multithreading,Atomic,Atomicity,我可以在不重要的情况下考虑原因,以及一种您可能不想使用它们的情况,也就是当您想测试一个设计是否具有非原子操作的行为时 还有什么其他原因?具体地说,我正在从事一个有一些罕见竞争条件的项目,因为测试不使用原子增量。我想知道,当一个函数已经存在时,为什么我不总是使用原子增量呢 谢谢 因为原子比较慢。它们降低了调用线程的速度,也可能降低其他线程的速度,甚至可能是那些不访问相同原子的线程。它们还可能会阻止编译器执行某些重新排序优化,否则它将执行这些优化。原子操作可能会比非原子操作更昂贵。在线程之间不需要同

我可以在不重要的情况下考虑原因,以及一种您可能不想使用它们的情况,也就是当您想测试一个设计是否具有非原子操作的行为时

还有什么其他原因?具体地说,我正在从事一个有一些罕见竞争条件的项目,因为测试不使用原子增量。我想知道,当一个函数已经存在时,为什么我不总是使用原子增量呢


谢谢

因为原子比较慢。它们降低了调用线程的速度,也可能降低其他线程的速度,甚至可能是那些不访问相同原子的线程。它们还可能会阻止编译器执行某些重新排序优化,否则它将执行这些优化。

原子操作可能会比非原子操作更昂贵。在线程之间不需要同步的情况下,例如更新非共享本地线程,Atomitice会增加不必要的开销,应该避免

让我把你的问题转到你身上。如果编写程序时,工作进程是作为新进程而不是新线程生成的,那么就不必担心对共享内存的原子更新,因为进程不共享内存。因此,与其问“为什么不总是使用原子操作?”不如问为什么不总是使用进程而不是线程?有趣的是,我想问题与为什么不使用原子是一样的,内存/速度等资源是有限的。当然。。。仅仅在任何地方使用原子实际上并不能改善线程安全性(如果你因此跳过正确的分析,可能会导致死锁)。@JamesKanze,原子不一定是锁-based@Leeor虽然这是真的,但它们也不能保证不使用锁定,还有其他锁定方法(或者将所有活动线程放入busylops,这没有任何帮助)。程序正确性是一个全局属性。@DonalFellows,对,我只是认为使用std::atomic并在某些情况下获得mfence而不是锁可能会非常混乱。我将其视为反对std::atomic的一个参数。