问题标签 [stdatomic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - MOV x86 指令是否实现了 C++11 memory_order_release 原子存储?
根据此https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html,已发布的存储MOV
在 x86(包括 x86-64)上实现为(到内存中)。
根据他的http://en.cppreference.com/w/cpp/atomic/memory_order
memory_order_release:
具有此内存顺序的存储操作执行释放操作:当前线程中的任何内存访问都不能在此存储之后重新排序。这确保当前线程中的所有写入在获取或相同原子变量的其他线程中可见,并且将依赖项携带到原子变量中的写入在消耗相同原子的其他线程中变得可见。
我知道当使用memory_order_release时,之前完成的所有内存存储都应该在此之前完成。
问题:一个裸指令(没有明确的内存围栏)怎么可能MOV
足以满足这种行为?如何MOV
告诉处理器完成所有以前的存储?
c++ - 为什么原子双重没有完全实现
我的问题很简单。为什么没有std::atomic<double>
完全实施?我知道这与原子 RMW(读-修改-写)访问有关。但我真的不明白,为什么在double
.
它指定可以使用任何可简单复制的类型。当然double
是其中之一。因此,C++11 需要可用于任何类类型的基本操作(加载、存储、CAS、交换等)。
但是,对于整数,可以进行一组额外的操作(fetch_add
、++
、+=
等)。
Adouble
与这些类型几乎没有区别。它是本机的、可简单复制的等。为什么标准不包含double
这些类型?
更新:C++20 确实专注std::atomic<T>
于浮点类型,带有 fetch_add 和 sub。 C++20 std::atomic<float>- std::atomic<double>.specializations 但不是原子绝对值 (AND) 或否定 (XOR)。
编者注:如果没有 C++20,您可以将自己的代码从 CAS 中推出;有关可移植示例,请参阅x86_64 上的原子双浮点或 SSE/AVX 向量加载/存储;atomic<double>
和 float 在大多数 C++ 实现中是无锁的。
c++11 - 原子 shared_ptr 对 `__atomic_load_16' 的未定义引用
我收到链接错误,例如
对于下面的代码
环境:
奇怪的是,当我构建 32 位版本时g++ -o yyy atomic.cpp --std=c++11 -m32
一切正常
我的编译器/链接器似乎有问题如何分析和解决它?
c++ - Is it safe to use the Structure dereference(->) operator on the result of std::atomic::load
Whilst trying to work with std atomic pointer, I ran into the following. Say I do this:
I'm pretty sure C is illegal because myString might be deleted in the meantime.
However I'm unsure about A and B. I suppose they are illegal since the pointer might be deferenced whilst performing the read operation.
However if this is the case, how can you ever read from an atomic pointer that might be deleted. Since the load is 1 step, and the reading of the data is 1 step.
c++ - 是否可以限制成员函数访问成员变量?
我有一个类似于这样的线程类:
有很多这样的运行实例。还有另一个线程不时调用 get_metrics()。
我想阻止run()
访问last_metrics_time_
,因为它不是原子的(只有一个指标收集器线程,所以没有问题)。
将last_metrics_time_
静态变量设为局部get_metrics
似乎并不正确,因为它将在get_metrics
第一次调用时初始化,而不是在程序启动时初始化。这将导致delta
(因为now
将非常接近last_metrics_time_
) 的值接近于零,并为第一次调用返回一个巨大的值。
c++ - 为什么只有 std::atomic_flag 保证是无锁的?
来自 C++ Concurrency in Action:
std::atomic 和 std::atomic_flag 之间的区别在于 std::atomic 可能不是无锁的;实现可能必须在内部获取互斥锁以确保操作的原子性
我想知道为什么。如果 atomic_flag 保证是无锁的,为什么不保证它atomic<bool>
也是如此?这是因为成员函数compare_exchange_weak
吗?我知道有些机器缺少一个比较和交换指令,是这个原因吗?
c++ - 为什么g ++仍然需要-latomic
在C++ 标准 2014 年 11 月工作草案的29.5 原子类型中,它指出:
- 有一个通用类模板原子。模板参数 T 的类型应该是可简单复制的(3.9)。[注意:不能静态初始化的类型参数可能难以使用。——尾注]
所以 - 据我所知 - 这个:
应该是完全有效的标准 c++14(以及 c++11)代码。但是,如果我不libatomic
手动链接,命令
给出 - 至少在 Fedora 22 (gcc 5.1) - 以下链接错误:
如果我写
一切都很好。我知道该标准没有说明必须包含的编译器标志或库,但到目前为止,我认为任何符合标准的单文件代码都可以通过第一个命令进行编译。
那么为什么这不适用于我的示例代码呢?是否有一个合理的原因-latomic
仍然是必要的,或者它只是编译器维护人员尚未解决的问题?
c++ - 如何使用 std::atomic 在不锁定互斥锁的情况下实现线程安全?
我知道,在某些情况下,您可以避免使用 锁定互斥锁 ( std::mutex
) std::atomic
,从而提高性能。
你能说出这样的情况吗,最好展示一些关于如何做到这一点的示例代码std::atomic
(你如何使用)?
此外,当我锁定一个互斥体时,性能会降低,因为其他线程在互斥体被锁定的时间段内无法继续工作。这是互斥锁的唯一问题吗?我的意思是,锁定/解锁互斥锁是一项昂贵的操作,还是只是我上面提到的?
c++ - 使用带有工作线程的 std::atomic_flag 问题
对冗长感到抱歉 - 我尽我所能将我的代码示例压缩成一个功能最少的类和main()
方法。
我试图在我的工作线程中使用atomic_flag
通知在被调用_rx()
时退出。stop()
我相信问题在于尝试创建我的工作线程,
thread SanityTestThread(&SanityTest::_rx, *this);
不知何故与我的atomic_flag
代码示例(不编译):
作为记录,我可以通过删除对我的所有引用并用for 循环atomic_flag
替换我的循环来编译和运行我的程序,如下所示:_rx()
编译器错误:
ps 这是编译的,g++ -pthread -std=c++0x -o SanityTest ./SanityTest.cpp
c++ - C++11 是否保证释放栅栏和消耗操作之间的内存排序?
考虑以下代码:
C++ 是否对线程 a 中的栅栏与线程 b 中的消费操作的交互做出任何保证?
我知道在这个例子中我可以用 store-release 替换栅栏 + atomic store 并让它工作。但我的问题是关于使用围栏的这种特殊情况。
阅读标准文本,我可以找到关于释放栅栏与获取栅栏的交互以及释放栅栏与获取操作的交互的条款,但没有关于释放栅栏和消费操作的交互的条款。
我认为,用获取替换消耗将使代码符合标准。但据我了解处理器实现的内存排序约束,我应该只需要线程 b 中较弱的“消耗”排序,因为内存屏障强制线程 a 中的所有存储在存储到指针之前可见,并且读取有效负载取决于从指针读取。
标准一致吗?