Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程同时读/写_C++_Multithreading - Fatal编程技术网

C++ 线程同时读/写

C++ 线程同时读/写,c++,multithreading,C++,Multithreading,如果我不关心Thread1是否同时更改Flag1Thread2更改Flag1,除了逻辑错误之外还有什么需要担心的吗?如果出现以下情况,是否会导致碰撞等: Thread1和Thread2同时读取Flag1 Thread1正在写入Flag1,而Thread2正在读取Flag1 在这些示例中,Flag1是一个bool该标志应标记为易失性。这将确保编译器不会以不一致的方式优化读/写 我相信对bool的读/写是原子性的——因此,如果您不关心访问顺序,我认为您不会有任何其他问题 据我所知,两个线程不能在同一

如果我不关心
Thread1
是否同时更改
Flag1
Thread2
更改
Flag1
,除了逻辑错误之外还有什么需要担心的吗?如果出现以下情况,是否会导致碰撞等:

  • Thread1
    Thread2
    同时读取
    Flag1
  • Thread1
    正在写入
    Flag1
    ,而
    Thread2
    正在读取
    Flag1

  • 在这些示例中,
    Flag1
    是一个
    bool

    该标志应标记为
    易失性
    。这将确保编译器不会以不一致的方式优化读/写


    我相信对bool的读/写是原子性的——因此,如果您不关心访问顺序,我认为您不会有任何其他问题

    据我所知,两个线程不能在同一时间访问同一内存

    即使在并行计算中,这些假设也会由处理器自动处理。

    所以答案是没有崩溃。
    当然,您会有逻辑错误,但因为您不在乎:p.

    根据C++11内存模型的规则:

  • Thread1和Thread2是否同时读取Flag1?这总是安全的
  • Thread1正在写入Flag1,而Thread2正在读取Flag1?这是一场数据竞赛


  • 数据竞争是未定义的行为。虽然它不太可能在任何sane硬件上崩溃,但它是未定义的行为,因此任何事情都可能发生。

    您可能需要仔细考虑“完全相同的时间”的真正含义以及这些操作在数字设备上是如何发生的。除非该标志是objecttyat的属性,否则它本身也不会发生崩溃。但是,您可能会错过状态的更改,或者在两个线程中检测到相同的更改。因此,将发生什么将取决于状态的变化。使其线程安全比试图处理“除了逻辑错误”之外的不安全后果要容易得多,因为您不关心程序逻辑,为什么还要麻烦呢?一个更简单的程序是“hello world”。它可能不做您想做的事情,但当您不关心逻辑错误时……值得提醒的是,尽管您不能同时读取和写入
    bool
    变量,但您可以同时写入和读取“数据结构”,就像读取
    vector[0]
    和写入
    vector[1]
    一样。关键是不能同时读写原子数据类型。“两个线程不能在同一时间访问同一内存。”那么共享内存呢?在时钟时间中是指同一时间。它们实际上轮流访问内存。我现在明白你的意思了,但我要说你的措辞有点误导。我要说的是,在最简单的模型中(我相信OP指的是),两个线程可以说同时运行,但从技术上讲,它们并没有。因此,不可能同时物理访问同一地址。但是,如果在线程切换操作之前读/写操作未完成,则可能存在操作系统/硬件锁定资源的情况(并可能导致另一个访问线程出错)。一般来说,这将由CPU/驱动程序/操作系统自动处理,但要正确回答这一问题,我们必须了解有关操作系统、平台和硬件类型的更多详细信息。不,
    volatile
    与线程无关,不,对bool的访问通常不保证是原子的(一些硬件可能提供更有力的保证,但这不是便携的。)虽然volatile会阻止编译器对读写进行重新排序,但它不会阻止硬件对读写进行重新排序。使用原子类型或原子操作来获得正确的语义。@JonathanWakely嗯..对不起,我不明白-你为什么说volatile与线程无关?@JonathanWakely-他不在乎重新排序为什么建议volatile?这与线程无关,请参阅@JonathanWakely我特别提到volatile是为了阻止编译器进行优化。这是一个
    尽最大努力
    的建议。我们不希望编译器优化整个标志条件,是吗?显然,他不关心顺序-所以不需要使用原子。C++03没有提到线程,所以根本不能保证任何工作。C++11提供了编译器和硬件供应商同意的保证,主要代表了现有实践的形式化。对于保证的和不保证的,你有更好的源代码吗?我没有,所以只能回答关于C++11内存模型。@EitanT:问题被标记为“C++多线程”。没有“线程”的概念在C++ 03中,这样的推理必须是C++ 11,而乔纳森的答案是迄今为止唯一正确的。如果提问者想知道一些特定于平台的线程模型,他需要识别平台。那么C++ C++中的C++数据11 mod,你对C++中的数据族语义有更好的参考吗?el在许多方面都是对现有实践的正式定义。你知道现在或将来有哪些编译器计划实现不同的内存模型吗?如果没有,那么建议人们遵循这些规则当然是明智的。@SvinSimpe如果任何一个线程写入共享变量,其他线程都不能同时读取或写入它。只有concur租金是可以的。