31得票3回答
内存栅栏:获取/加载和释放/存储

我对 std::memory_order_acquire 和 std::memory_order_release 的理解如下:Acquire 的意思是,在 acquire fence 之后的内存访问不能被重排序到 fence 之前。Release 的意思是,在 release fence 之前...

29得票4回答
使用4个线程的获取/释放语义

我目前正在阅读安东尼·威廉姆斯的《C++ Concurrency in Action》。他的其中一段代码如下,并指出断言z != 0可能会触发。 #include <atomic> #include <thread> #include <assert.h>...

29得票1回答
`is_always_lock_free`在macOS上返回`true`,但`is_lock_free()`却返回`false`,为什么?

我正在尝试使用 C++ 原子变量的 std::atomic<T>::is_always_lock_free 和 std::atomic<T>::is_lock_free 进行实验。 我编写了一个简单的结构体 A,想知道原子版本的 A 是否是无锁的: #include...

26得票2回答
C++11:memory_order_relaxed和memory_order_consume的区别

我正在学习C++11内存顺序模型,并想了解memory_order_relaxed和memory_order_consume之间的区别。 具体来说,我正在寻找一个简单的例子,其中不能用memory_order_relaxed替换memory_order_consume。 有一篇优秀的文章详...

26得票3回答
如何高效使用std::atomic

std::atomic 是 C++11 引入的新特性,但我找不到太多关于如何正确使用它的教程。下面的做法是否常见且有效呢? 我采用了一种做法,我们有一个缓冲区,我想在其中一些字节上进行 CAS 操作,所以我所做的是:uint8_t *buf = .... auto ptr = reinter...

23得票1回答
对于std::atomic<bool>,赋值操作等同于load/store吗?

我看到这个问题可能在Must I call atomic load/store explicitly?中得到了回答。 为了清晰起见,我将简洁地重述我的问题,希望未来的读者能够理解: 是std::atomic&lt;bool&gt; b(false); bool x = b; 与Same a...

22得票2回答
C++内存模型中的原子加载能否合并?

考虑以下C++ 11代码片段。对于GCC和clang,这将编译为foo的两个(顺序一致)加载。(编辑注:编译器不会优化原子操作,请参见this Q&amp;A以获取有关此可能创建的问题的更多详细信息,特别是http://wg21.link/n4455标准讨论,该标准未提供程序员解决问题的工具。...

22得票2回答
C++11进程间原子操作和互斥锁

我有一个Linux程序,它会生成多个进程(fork),并通过POSIX共享内存进行通信。我希望每个进程都分配一个id(0-255)。我的想法是在共享内存区域中放置一个位向量(初始化为零),并原子地比较和交换一个位来分配id。 是否有c++11友好的方法来实现这一点?我可以创建一个原子位集吗?...

21得票6回答
C++内存模型中哪些确切规则防止在获取操作前重新排序?

我有一个关于以下代码中操作顺序的问题:std::atomic&lt;int&gt; x; std::atomic&lt;int&gt; y; int r1; int r2; void thread1() { y.exchange(1, std::memory_order_acq_rel);...

21得票2回答
如何打印std::atomic<unsigned int>的值?

我在我的程序中使用了std::atomic&lt;unsigned int&gt;。我该如何使用printf打印它的值?如果我只使用%u,它不起作用。我知道我可以使用std::cout,但是我的程序中到处都是printf调用,我不想替换每一个调用。以前我使用的是unsigned int而不是s...