21得票2回答
命名空间 'std' 中没有名为 'atomic' 的类型。

为什么不呢?std::atomic<int> index; 工作? 目前使用LLVM 3.1和这些参数C Language Dialect GNU [-std=gnu99] C++ Language Dialect [-std=c++11] C++ Standard Librar...

21得票1回答
为什么允许对volatile std::atomics进行复制赋值?

std::atomic 已删除了复制赋值运算符。因此,以下代码会导致编译错误: std::atomic<int> a1, a2; a1 = a2; // Error 我认为删除运算符的动机在这篇文章中已经解释得很清楚了。到目前为止,一切顺利。 但是我注意到,添加volatil...

20得票2回答
std::atomic和std::condition_variable wait、notify_*方法之间的区别

我在查看“原子操作库”时,发现了一个新的C++20特性:原子“等待(wait)”和“通知(notify_)”方法。我很好奇它们与std::condition_variable的“等待(wait)”和“通知(notify_)”方法的区别是什么。

20得票3回答
无锁单向链表的原子 shared_ptr

我想知道是否有可能为任何“常见”的架构(如x64或ARMv7 / ARMv8)创建无锁、线程安全的共享指针。 在关于cppcon2014上的无锁编程的演讲中,Herb Sutter展示了一个(部分)无锁单向链表实现。该实现看起来相当简单,但它依赖于一个原子shared_ptr实现,该实现尚不...

19得票1回答
为什么线程内存错误检测器会抱怨 acquire/release 线程屏障?

我正在学习不同的内存顺序。 我有这段代码,它可以正常工作并通过GCC和Clang的线程内存检测: #include <atomic> #include <iostream> #include <future> int state = 0; st...

19得票2回答
std::atomic::notify_one可能会解除多个线程的阻塞

根据cppreference的说法,std::atomic<T>::notify_one()会通知至少一个正在等待该原子操作的线程。这意味着根据标准它可能解除多个线程的阻塞。这与std::condition_variable::notify_one()不同,后者指定它只会解除一个线...

19得票2回答
memory_order_consume 和 memory_order_acquire 的区别

我有一个关于GCC-Wiki文章的问题。在标题“总体概述”下,给出了以下代码示例: 线程 1:y.store (20); x.store (10); 线程2:if (x.load() == 10) { assert (y.load() == 20) y.store (10) } 据说,...

18得票1回答
x64上的非临时存储与获取/释放语义

我有一个类似以下的东西:if (f = acquire_load() == ) { ... use Foo } 和:auto f = new Foo(); release_store(f) 你可以很容易地想象一个使用原子操作acquire_load和release_store的实现,其中...

18得票6回答
“发布顺序”是什么意思?

我不明白,在下面的示例中,如果我们有两个线程,为什么没有释放序列就会出现问题。 我们对原子变量count只进行了2次操作。 如输出所示,count按顺序递减。 来自《C++并发编程实战》,作者:Antony Williams 我提到过,即使在一系列的 read-modify-write 操...

18得票1回答
原子函数指针调用在gcc中编译,但在clang和msvc中不行。

当从原子函数指针调用函数时,例如: #include <atomic> #include <type_traits> int func0(){ return 0; } using func_type = std::add_pointer<int()>:...