通过同时读取成功写入
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 的评论所说,你的问题的正确答案是写会成功,但你仍然不应该这样做。
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- cmake在我的项目中所需的所有静态库都不成功
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 如何允许我的程序成功读取数字包含的文件
- 为什么这个文件不成功读取
- 读取功能失败时的成功消息
- 通过同时读取成功写入
- C++ 读取注册表 使用服务失败时,但在控制台中成功
- tinyxml2:如何知道从流缓冲区成功读取的字符数
- 为什么我不能成功地将文件数据读取到结构数组
- 检查是否从std::istream中成功读取了所有值