什么是线程间操作

What is an inter-thread operation

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

"Inter-thread happens-before also combines with the sequenced-before relation: if operation A is sequenced before operation B, and operation B inter-thread happens- before operation C, then A inter-thread happens-before C. Similarly, if A synchronizes- with B and B is sequenced before C, then A inter-thread happens-before C. These two together mean that if you make a series of changes to data in a single thread, you need only one synchronizes-with relationship for the data to be visible to subsequent opera- tions on the thread that executed C." 空

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

"Communication" 可能不是最好的思考方式... "Interaction" 更好。如果线程 A 写入文件句柄,然后线程 B 关闭该文件句柄,它们是否进行了通信?不是真的,但是如果线程 B 在 之前 关闭句柄,然后 A 写入它,那么写入将由于它们之间的 交互 而失败。

所以不要仅仅将其视为数据传输。线程通常需要彼此 协调 ,无论它们是否在通信,协调最重要的方面是以有意义的顺序做事。由于线程 运行 是异步的并且(实际上)是非确定性的顺序,所以这不是一件微不足道的事情。因此,重点关注基本无序环境中这些简单但可组合的有序计算原语。

该上下文中的术语线程间 不绑定到线程间通信的特定通道或方法,而是绑定到happens-before 的概念.

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

if operation A is sequenced before operation B, and operation B inter-thread happens-before operation C, then A inter-thread happens-before 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.

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

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