【问题标题】:What is an inter-thread operation什么是线程间操作
【发布时间】:2015-12-06 20:37:40
【问题描述】:

我一直在阅读一本关于 C++ 中的多线程的书,但我对线程间这个术语的实际含义感到非常困惑。起初我以为它是用来描述线程之间的通信的。但是随着这本书越来越深入,它开始更松散地使用这个术语,以至于我不再明白它的含义。以这个短段为例

“线程间happens-before还结合了sequenced-before关系:如果操作A在操作B之前排序,并且操作B在线程间发生在操作C之前,那么A在线程间发生在C之前。类似地,如果 A 同步 - 与 B 并且 B 在 C 之前排序,则 A 线程间发生在 C 之前。这两者一起意味着如果您在单个线程中对数据进行一系列更改,则只需一个同步 -关系,以便数据对执行 C 的线程上的后续操作可见。” 空

读完那段后,我正式迷路了。而这本书,一直非常擅长解释新术语,完全忘记了这一点。这让我觉得这是一个不需要解释的常用术语,这使得提出这个问题变得更加困难。那么有人可以花时间解释这个术语的实际含义吗?

【问题讨论】:

  • 这需要一点关于 happens-before 关系的理论,在试图理解这段话之前你读过一些相关的东西吗?

标签: c++ multithreading sequential


【解决方案1】:

在该上下文中,术语线程间不受线程之间通信的特定通道或方法的约束,而是与happens-before的概念相关。 p>

让我们以你引用的段落为例:

如果操作A在操作B之前排序,并且操作B在线程间发生在操作C之前,那么A在线程间发生在C之前

在下面的代码中

thread1
--------------
0x10: int a = 1;
0x11: sendResultToThread(a);


thread2
--------------
0x12: int c = getResultFromOtherThread();

在没有数据竞争的情况下进行简化并假设此处涉及的指令具有原子性,该句子表示如果操作 0x10 在 0x11 之前排序(并且在同一个线程中,因为它在源代码中位于之前)并且操作 0x11 happens-before 在多线程上下文中(即有某种机制,在执行 0x12 之前,0x11 产生的记忆效应对 0x12 可见,并且除其他外还确保 0x11 将多线程交互时总是在 0x12 之前临时执行),然后 0x10 线程间发生在 C 之前。

第二句也可以得出类似的结论。

所以回答你的问题:线程间操作(不要与线程内混淆,即在同一个线程中)是指交互和同步(显式或隐式)线程之间。不要从共享内存区域等方面考虑它,因为它可能会妨碍您对所解释概念的推理。

【讨论】:

    【解决方案2】:

    “沟通”也许不是最好的思考方式……“互动”更好。如果线程 A 写入文件句柄,然后线程 B 关闭该文件句柄,它们是否进行了通信?不是真的,但是如果线程 B 在 A 写入之前关闭句柄 ,那么由于它们之间的交互,写入将失败。

    因此,不要只将其视为数据传输。线程通常需要相互协调,无论它们是否正在通信,而协调的最重要方面是按照有意义的顺序做事。由于线程异步运行并且(实际上)以不确定的顺序运行,因此这不是一件容易的事。因此,我们将重点放在这些简单但可组合的基本无序环境中的有序计算原语上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多