【问题标题】:Correctness of reading data from multiple threads多线程读取数据的正确性
【发布时间】:2013-08-27 13:30:57
【问题描述】:

我在主线程中创建了一个全局变量 (C++),并将其值设置为 X,然后设置为 Y。 之后我产生多个线程并从这个变量中读取。 我能保证我会读 Y 吗?

如果不是,读(共享)互斥保护会解决它吗? (即使互斥锁总是可以使用的)

究竟是什么迫使多个处理器的缓存同步?

【问题讨论】:

  • 从多个线程读取是安全的,只要同时没有写入变量。

标签: c++ multithreading


【解决方案1】:

启动线程会引入隐式内存屏障。

C++11 保证在 §30.3.1.2 中构造 std::threads

同步:构造函数的调用完成 与 f 副本的调用开始同步。

其中 f 是线程正在执行的函数。另请参阅 §1.10 以了解 synchronizes with 的定义(或查看 this blog post)。

通俗地说,从不同线程同时读取值是安全的,并且保证它们都将读取最新的正确值。这当然只有在您开始启动线程后没有人对该变量执行任何写入的情况下才是正确的。在这种情况下,您将需要原子锁或显式锁(即互斥锁)。

【讨论】:

  • 你知道标准在哪里说编译器必须尊重这一点吗?
  • @OllieB §30.3.1.2 关于构造std::threads:同步:构造函数调用的完成与 f 的副本调用的开始同步。 其中 f 是线程正在执行的函数。另请参阅 §1.10 以了解 synchronizes with 的定义。
  • 这应该在你的答案中,因为它是明确的。
【解决方案2】:

如果您Y 分配给您的变量后生成线程,它们确实会看到该值。

read(shared)-mutex protection 会解决它吗?

仅当您同时修改变量时才需要互斥锁(无论其他并发操作是读取还是写入)。如果你从不同时修改你的变量(就像这里的情况),你不需要互斥锁。

究竟是什么迫使多个处理器的缓存同步?

通常,对内存位置的写入将使其他处理器上的相应缓存条目无效。当您再次访问该变量时,如果需要,相应的处理器将重新填充缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2018-08-17
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多