在一个线程内,steady_clock::now()
保证返回单调递增的值。这如何与多个线程观察到的内存排序和读取交互?
atomic<int> arg{0};
steady_clock::time_point a, b, c, d;
int e;
thread t1([&](){
a = steady_clock::now();
arg.store(1, memory_order_release);
b = steady_clock::now();
});
thread t2([&](){
c = steady_clock::now();
e = arg.load(memory_order_acquire);
d = steady_clock::now();
});
t1.join();
t2.join()
assert(a <= b);
assert(c <= d);
这是重要的一点:
if (e) {
assert(a <= d);
} else {
assert(c <= b);
}
这些断言会失败吗?还是我对获取释放内存顺序有误解?
以下主要是对我的代码示例的解释和阐述。
线程t1
写入 atomic arg
。它还分别记录了写入之前和之后的当前a
时间b
。steady_clock
保证a <= b
。
线程t2
从原子读取arg
并保存读取的值e
。c
它还分别记录了读入和读入前后的当前时间d
。steady_clock
保证c <= d
。
然后连接两个线程。此时e
可能是0
或1
。
如果e
是0
,则在写入t2
之前读取该值。这是否也意味着in之前发生过in ?t1
c = now()
t2
b = now()
t1
如果e
是1
然后在读取t1
之前写入值。这是否也意味着in之前发生过in ?t2
a = now()
t1
d = now()
t2
以下是一些无法回答我所问问题的现有问题:
即使使用多核上下文,是否有任何 std::chrono 线程安全保证?
我不是在问是否now()
是线程安全的。我知道它是。
这个更接近,但该示例使用mutex
. 我可以对弱于 的内存排序做出相同的假设seq_cst
吗?