Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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
C++ 如何做类似“的事情”;原子上是可分配的吗;?_C++_C++11_X86_X86 64_Atomic - Fatal编程技术网

C++ 如何做类似“的事情”;原子上是可分配的吗;?

C++ 如何做类似“的事情”;原子上是可分配的吗;?,c++,c++11,x86,x86-64,atomic,C++,C++11,X86,X86 64,Atomic,当然,std中没有这样的东西,但我需要等效的功能 我在类型T上有一个无锁数据结构模板,其中T由用户提供,我需要静态断言的是,T是一个可在x86或x86-64上原子分配的类型(它包括所有内置整型常量和浮点类型,以及其中的任何typedef,但我认为不一定限于这些)。我猜想,仅仅检查类型是可分配的,并且它的sizeof是“原子可分配的”,并不是使用类型实现无锁数据结构的充分条件,因此这种想法从一开始就走错了路 使用 STD::原子(和朋友)是C++中唯一实现原子锁和有序保证所必需的实现无锁数据结构的

当然,std中没有这样的东西,但我需要等效的功能

我在类型T上有一个无锁数据结构模板,其中T由用户提供,我需要静态断言的是,T是一个可在x86或x86-64上原子分配的类型(它包括所有内置整型常量和浮点类型,以及其中的任何typedef,但我认为不一定限于这些)。我猜想,仅仅检查类型是可分配的,并且它的sizeof是“原子可分配的”,并不是使用类型实现无锁数据结构的充分条件,因此这种想法从一开始就走错了路


使用<代码> STD::原子(和朋友)是C++中唯一实现原子锁和有序保证所必需的实现无锁数据结构的方法。如果没有其他线程会看到原子分配,那么它就没有用处。

为什么要使用内置类型而不是
std::Atomic
?如果内置类型上存在数据竞争,您知道程序的行为是未定义的吗?我不确定,但我记得小数据量不足以支持原子,另外数据必须对齐。您是否询问如何实现traits类,或者如何以合理的泛型方式为内置类型提供traits类的专门化?“强制T为std::atomic,然后检查is_lock\u free()是不可能的。”允许
T
为任何类型,然后检查
std::atomic::is_lock\u free()如何
?@MichaelUrman任意一个选项。绝对错误地认为这是一个充分条件。这是各种算法中的一个充分条件,如图3。“数据”的加载和存储需要是原子的,这就是它(对于Pad和Prad同样,但它们不是用户提供的,所以除了点之外,在我的问题中T类型是“数据”)。C++中不是足够的条件。C++不保证这些加载和存储加载正确的数据,除非加载和存储被排序。语言没有定义问题的需求——问题是!如果语言中的标准结构不适合,这又是需求的错误吗?那是一个可笑的提议。如果STD原子不能解决问题,那么我需要一个替代的解决方案——除非问题要求允许发生任何事情,否则C++中的问题要求不能满足。因为C++允许任何事情发生,如果你同时读写到内存位置,而没有两个操作之间的排序。C++可以允许任何事情发生,但是我们为真实的机器编程,而特定的目标架构提供了额外的保证。例如,我的问题明确指出,我只关心x86/x86-64,我正在寻找适合我的情况的最佳解决方案,而不是柏拉图式数学绝对世界中的绝对通用解决方案。