标签: stdatomic

我什么时候真的需要使用原子<bool>而不是bool?

不是atomic<bool>多余的,因为bool它本质上是原子的吗?我认为不可能有部分修改的bool值.我什么时候真的需要用atomic<bool>而不是bool

c++ atomicity c++11 stdatomic

80
推荐指数
6
解决办法
5万
查看次数

std :: atomic的锁在哪里?

如果数据结构中包含多个元素,则它的原子版本不能(始终)无锁.我被告知这对于较大的类型是正确的,因为CPU不能在不使用某种锁的情况下以原子方式更改数据.

例如:

#include <iostream>
#include <atomic>

struct foo {
    double a;
    double b;
};

std::atomic<foo> var;

int main()
{
    std::cout << var.is_lock_free() << std::endl;
    std::cout << sizeof(foo) << std::endl;
    std::cout << sizeof(var) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出(Linux/gcc)是:

0
16
16
Run Code Online (Sandbox Code Playgroud)

由于原子和foo大小相同,我不认为锁存储在原子中.

我的问题是:
如果一个原子变量使用一个锁,它存储在哪里,这对该变量的多个实例意味着什么?

c++ x86 atomic c++11 stdatomic

67
推荐指数
3
解决办法
4729
查看次数

c ++,std :: atomic,什么是std :: memory_order以及如何使用它们?

任何人都可以用简单的英语解释什么是std :: memory_order,以及如何将它们与std :: atomic <>一起使用?

我在这里找到了参考文献和一些例子,但根本不了解. http://en.cppreference.com/w/cpp/atomic/memory_order

谢谢.

c++ multithreading atomic memory-model stdatomic

66
推荐指数
4
解决办法
1万
查看次数

为什么编译器没有合并多余的std :: atomic写入?

我想知道为什么没有编译器准备将相同值的连续写入合并到单个原子变量,例如:

#include <atomic>
std::atomic<int> y(0);
void f() {
  auto order = std::memory_order_relaxed;
  y.store(1, order);
  y.store(1, order);
  y.store(1, order);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的每个编译器都会发出三次上面的编写.什么合法的,无种族的观察者可以看到上述代码与具有单次写入的优化版本之间的差异(即,不是"假设"规则适用)?

如果变量是易变的,那么显然不适用优化.在我的情况下有什么阻止它?

这是编译器资源管理器中的代码.

c++ multithreading compiler-optimization c++11 stdatomic

47
推荐指数
5
解决办法
4494
查看次数

无锁同步总是优于使用锁的同步吗?

在 C++ 中,有一种原子类型std::atomic<T>。该原子类型可能是无锁的,也可能不是,具体取决于类型 T 和当前平台。如果某个类型的无锁实现在类型 T 的平台上可用,那么大多数编译器都会提供无锁atomic<T>。在这种情况下,即使我想要非无锁atomic<T>我也无法拥有它。

C++ 标准决定只保留一个,std::atomic<T>而不是一std::atomic<T>加一std::lock_free<T>(部分针对特定类型实现)。这是否意味着“在任何情况下,当后者可用时,使用非无锁原子类型都会比使用无锁原子类型更好”?(主要是在性能方面而不是易用性方面)。

c++ synchronization lock-free stdatomic

45
推荐指数
4
解决办法
8227
查看次数

std :: atomic <std :: string>是否正常工作?

我正在阅读Anthony Williams的"行动中的C++并发"和第5章,其中讨论了新的多线程感知内存模型和原子操作,并指出:

为了std::atomic<UDT>用于某些用户定义的UDT类型,此类型必须具有普通的复制赋值运算符.

据我了解,这意味着std::atomic<UDT>如果以下内容返回true ,我们可以使用:

std::is_trivially_copyable<UDT>::value
Run Code Online (Sandbox Code Playgroud)

通过这种逻辑,我们不应该使用它std::string作为模板参数std::atomic并使其正常工作.

但是,以下代码使用预期输出进行编译和运行:

#include <atomic>
#include <thread>
#include <iostream>
#include <string>

int main()
{
    std::atomic<std::string> atomicString;

    atomicString.store( "TestString1" );

    std::cout << atomicString.load() << std::endl;

    atomicString.store( "TestString2" );

    std::cout << atomicString.load() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个未定义的行为,恰好按预期行事吗?

提前致谢!

c++ atomic stdstring stdatomic

44
推荐指数
2
解决办法
2万
查看次数

memory_order_seq_cst和memory_order_acq_rel有何不同?

存储是释放操作,负载是两者的获取操作.我知道这memory_order_seq_cst意味着要为所有操作强加一个额外的总排序,但是我没有建立一个例子,如果所有的操作memory_order_seq_cst都被替换,那就不是这样了memory_order_acq_rel.

我是否会遗漏某些内容,或者差异仅仅是文档效果,即memory_order_seq_cst如果有人打算不使用更轻松的模型并且memory_order_acq_rel在约束轻松模型时使用,则应该使用?

c++ memory-model c++11 stdatomic

30
推荐指数
3
解决办法
6657
查看次数

在 macOS 上,“is_always_lock_free”给出“true”,但“is_lock_free()”给出“false”,为什么?

我正在尝试 C++ 原子std::atomic<T>::is_always_lock_freestd::atomic<T>::is_lock_free.

我写了一个简单的结构体A,想知道 的原子版本是否A是无锁的:

#include <iostream>
#include <atomic>

using namespace std;

struct A {
  int x;
  int y;
  int z;
};

int main() {
  atomic<A> b;

  cout << boolalpha;
  cout << "b.is_always_lock_free = " << b.is_always_lock_free << endl;
  cout << "b.is_lock_free = " << b.is_lock_free() << endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

x86-64 Linux上,我用g++ 9.4.0和C++17编译它,输出正常:

b.is_always_lock_free = false
b.is_lock_free = false
Run Code Online (Sandbox Code Playgroud)

然而,我也在我的Mac(ARM64 )上用clang++ 16.0.0编译它,输出很奇怪:

b.is_always_lock_free = true …
Run Code Online (Sandbox Code Playgroud)

c++ macos clang lock-free stdatomic

29
推荐指数
1
解决办法
664
查看次数

"使用已删除的函数"错误与std :: atomic_int

我想使用std::atomic_int变量.在我的代码中,我有:

#include <atomic>

std::atomic_int stop = 0;

int main()
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个编译错误:

use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
 std::atomic_int stop = 0;
                        ^
Run Code Online (Sandbox Code Playgroud)

对于发生了什么有什么想法?

c++ c++11 stdatomic

24
推荐指数
1
解决办法
2万
查看次数

为什么线程清理程序会抱怨获取/释放线程栅栏?

我正在学习不同的记忆顺序。

\n

我有这段代码,它可以工作并通过 GCC 和 Clang 的线程清理程序

\n
#include <atomic>\n#include <iostream>\n#include <future>\n    \nint state = 0;\nstd::atomic_int a = 0;\n\nvoid foo(int from, int to) \n{\n    for (int i = 0; i < 10; i++)\n    {\n        while (a.load(std::memory_order_acquire) != from) {}\n        state++;\n        a.store(to, std::memory_order_release);\n    }\n}\n\nint main()\n{    \n    auto x = std::async(std::launch::async, foo, 0, 1);\n    auto y = std::async(std::launch::async, foo, 1, 0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我认为如果它最终没有返回,则“获取”加载是不必要的from,那么“获取”负载是不必要的,因此我决定使用“宽松”负载,然后使用“获取”栅栏。

\n

我期望它能工作,但它被线程清理程序拒绝了,线程清理程序声称并发state++是数据竞争。

\n
#include <atomic>\n#include <iostream>\n#include <future>\n    \nint state = 0;\nstd::atomic_int …
Run Code Online (Sandbox Code Playgroud)

c++ atomic memory-barriers stdatomic thread-sanitizer

21
推荐指数
1
解决办法
1244
查看次数