我可以做一些类似的事情吗(意味着没有未定义的行为(,我不在乎顺序:(:
typedef std::atomic<double> a_t;
static a_t a1(1);
static a_t a2(2);
static a_t a3(3);
void f1()
{
a1.fetch_add(a2.load(std::memory_order::relaxed), std::memory_order::relaxed);
};
void f2()
{
a1.fetch_add(a3.load(std::memory_order::relaxed), std::memory_order::relaxed);
};
th1 = std::thread(f1);
th2 = std::thread(f2);
th1.join();
th2.join();
谢谢!
Ps:这个例子只是为了提问!
在这个评论之后;我有一种感觉,你的例子"我添加了以下内容Ps:假设许多线程在上面示例中的原子之上从所有这些原子进行写入和读取。
读取和写入原子变量永远不会导致数据争用,因此,如果由于数据争用而在多个线程中不同步,也不会导致未定义的行为,就像正常变量一样。
然而,这并不能阻止比赛条件,尽管没有未定义的行为,但比赛条件可能会产生意外的结果。例如,这里a2
的负载可以读取将被添加到a1
的一个值,但是在将其添加到a1
之前,a2
的值可以由另一个线程改变。load
和fetch_add
分别是原子,但整个表达式不是。
使用松弛操作,线程也不必同意修改多个原子变量的顺序。只有任何给定的单个原子的修改顺序是一致的。