繁体   English   中英

同时读取写入的成功

[英]Success of write with simultaneous read

如果程序中的一个线程尝试从另一个变量读取而另一个线程写入变量,则读取的值当然是未定义的。 但是,假设只有一个作者,写保证成功吗? 例如:

bool myGlobalVariable = false;
void thread1() {
    myGlobalVariable = true;
}
void thread2() {
    bool x = myGlobalVariable; //x is undefined
}

在这种情况下,一旦两个线程都完成, myGlobalVariable保证是true

我特别想知道linux上的gcc,但我有兴趣知道其他操作系统和编译器的作用,或者ARM的行为是否与x86不同。

在实践中,没有什么可能失败。 但是,C ++ 11/14标准在这方面非常清楚。 以下是C ++ 14草案部分[intro.multithread]/23 (强调我的)的引用:

程序的执行包含数据竞争,如果它包含两个可能同时发生冲突的动作,其中至少有一个不是原子的,并且除了下面描述的信号处理程序的特殊情况之外,它们都不会发生在另一个之前。 任何此类数据争用都会导致未定义的行为。

[intro.multithread]/6中定义冲突行为的地方:

如果其中一个修改内存位置(1.7)而另一个访问或修改相同的内存位置,则两个表达式评估会发生冲突

我无法看到在任何情况下,如果它只是一个写而不是一个读,这可能无法写入该值。

对同一变量进行多线程访问的原因很明显,就是在操作期间是否正在修改变量时, 不会进行检查 这不是它可能检查然后抱怨。

因此,在单个写入的情况下,只是一个写入(所以没有i++ ,这也是一个读取),它必须成功。

当然,如果您愿意,可以设计出会失败的硬件,但我不知道任何标准架构如何失败。

正如Anton在他的回答中指出的那样,规范说它是未定义的行为,因此有可能编写一个有效的C ++编译器,故意注意这种行为并随机化结果。 但是在实践中没有编译器会这样做。

也就是说,依靠官方未定义的行为绝不是一个好主意,所以正如jeffamaphone的评论所说,你的问题的正确答案是写作会成功,但你仍然不应该这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM