首页 > 解决方案 > 是否可以鼓励线程排队而不强迫它?

问题描述

我有一个多个线程正在加载的单个原子变量,它们对其执行一些本地计算,然后在其上调用原子的 fetch_and。他们检查他们是否能够在另一个线程之前进行更改,如果没有,则使用从 fetch_and 返回的更新值重复

工作速度比锁定版本快得多。但是,如果我可以鼓励多个线程对齐并且在 fetch_and 完成而不强制它完成之前不加载原子序数,那就太好了。

这可能吗?认为它可能正在使用一两个内存围栏?

标签: c++multithreadingthread-safetymemory-barriers

解决方案


毫无意义。如果两个线程不尝试同时执行此操作,它们将取得完美的进展。如果两个线程确实尝试同时执行此操作,则其中一个线程将不得不以某种方式等待。其他线程等待的方式对性能没有影响。

如果每个线程在访问原子变量之间需要大约相同的时间,它们会自然地排成一行,因为它们会一次通过第一个这样的访问。如果线程需要不同的时间,那么排列它们的尝试不可能成功。防止两个线程同时到达的唯一方法是减慢其中一个线程的速度,而它们同时到达的后果就是其中一个线程变慢了。

如果本地计算需要很长时间,以至于您的代码可能会花费大量时间进行被丢弃的计算,请切换到使用锁。


推荐阅读