Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么只有std::atomic_标志保证是无锁的? 在动作中C++并发:_C++_Multithreading_Atomic_Lock Free_Stdatomic - Fatal编程技术网

为什么只有std::atomic_标志保证是无锁的? 在动作中C++并发:

为什么只有std::atomic_标志保证是无锁的? 在动作中C++并发:,c++,multithreading,atomic,lock-free,stdatomic,C++,Multithreading,Atomic,Lock Free,Stdatomic,std::atomic和std::atomic_标志之间的区别在于std::atomic可能不是无锁的;为了确保操作的原子性,实现可能必须在内部获取互斥 我想知道为什么。如果保证atomic_标志是无锁的,为什么不保证atomic也是无锁的? 这是因为成员函数compare\u exchange\u弱?我知道有些机器缺少一条比较和交换指令,这是原因吗?首先,您完全可以拥有类似于std::atomic的东西,因此std::atomic本身通常不能保证是无锁的(虽然在大多数系统上,像bool或int

std::atomic和std::atomic_标志之间的区别在于std::atomic可能不是无锁的;为了确保操作的原子性,实现可能必须在内部获取互斥

我想知道为什么。如果保证atomic_标志是无锁的,为什么不保证
atomic
也是无锁的?
这是因为成员函数
compare\u exchange\u弱
?我知道有些机器缺少一条比较和交换指令,这是原因吗?

首先,您完全可以拥有类似于
std::atomic
的东西,因此
std::atomic
本身通常不能保证是无锁的(虽然在大多数系统上,像
bool
int
这样的琐碎类型的大多数专门化都可能实现),但这有点不相关

N2427/29.3中的注释给出了
atomic_flag
和其他任何必须是无锁的确切原因:

因此,操作必须是无地址的。没有其他类型需要无锁操作,因此原子_标志类型是符合此标准所需的最低硬件实现类型。剩余类型可以使用原子_标志进行模拟,尽管其属性不太理想


换句话说,这是每个平台上必须保证的最低要求,因此有可能正确实施该标准。

该标准不保证原子对象是无锁的。在不为类型
t
提供无锁原子操作的平台上,
std::atomic
对象可以在在这种情况下,任何在其实现中使用这些对象的容器也不会是无锁的

标准提供了检查
std::atomic
变量是否无锁的机会:您可以使用
var.is\u lock\u free()
atomic\u无锁(&var)
。对于int等基本类型,还提供了宏(例如
atomic\u int\u lock\u free
)指定对该类型的无锁原子访问是否可用


std::atomic_flag
是一种原子布尔类型。对于
boolean
类型,几乎总是不需要使用互斥或其他方式进行同步。

因为
std::atomic
有一个类型参数,std::atomic_flag没有。T更新是否是原子的取决于处理器体系结构。库编写器可以检查原子标志的任何合适类型。好的。但是我的问题是关于
std::atomic
std::atomic_标志
之间的本质区别,我认为正确和正确没有区别uselessly@curiousguy:我不会这么说。在大多数平台上,所有类型(包括复合类型)小于16字节的是无锁的。除了一些微控制器或35年前的垃圾软件外,几乎所有8字节的东西都是无锁的。如果需要知道,您可以查询您的实现,但更重要的是,您可以编写在任何情况下都能工作的代码,并且在大多数体系结构上都能以尽可能快的速度工作。这实际上相当酷。是的。“你完全可以拥有像std::atomic这样的东西”,你可以,但它不是很有用。@curiousguy:同样,我也不一定这么说。有些情况下,你有不止一个值(例如,解释计数),您可能希望同时比较其中一个或两个,具体取决于您所做的操作。因此,只要大小低于某个双指针大小的魔法常数,您就可以随心所欲地进行操作,并且可以正常工作。我希望有类似缓存线大小的原子(实际上为什么不…)是的,但是有一个ptr和一个使用计数的“不止一个值”并不是一个非常大的结构。
非常重要的大型结构
有一个“数百字节大小”的含义。或者可能只是我。