2017-08-15 89 views
0

比方说,我们有这样的一段代码,这是正确的(我希望至少):组合原子和非原子变量和缓存

std::atomic<int> a; 
std::atomic<bool> ready{false}; 
void threadA() { 
    a.store(666, std::memory_order_relaxed); 
    ready.store(true, std::memory_order_release); 
} 

void threadB() { 
    while(!ready.load(std::memory_order_acquire)); 
    process(a.load(std::memory_order_relaxed)); 
} 

我的问题是:在这种情况下,你使用的是int a;代替std::atomic<int> a;,这是正确的?或者是否存在缓存刷新/失效问题?

+0

如果您必须要求...使用顺序一致性。除非经过严格的评论和封装,即使你明白你在做什么,维护你的代码的人也不会。 –

+0

这不是真的用于特定的用例。对于理论来说,这比理解更多;)。 但是,此代码是否可以与顺序一致性工作? –

+1

对我来说看起来很好。我会鼓励你观看这个叫做“原子武器”的演讲。这一切对我来说都是有意义的。 https://www.youtube.com/watch?v=c1gO9aB9nbs –

回答

1

不管这是一个好主意,作为一个例子,你的代码是很好..

您可以用常规int(或任何类型为此事)取代原子类型的a
C++标准支持与下面的语句的情况下(第1.10.1-6):

某些库的调用由另一个线程执行的其他库调用同步。例如,原子商店释放与负载获取该获取其值从商店

由于threadB载荷由threadA(它是在一个循环中等待它),则存储的ready值同步同步 - 与建立关系。 因此,a.load()观察到a.store()的记忆效应。另一种说法是,a.store()发生在之间a.load()

+0

是的,但我的问题更多的是:是否正确地将原子变量替换为非原子变量。你在开始时回答;) –