什么是线程间操作

What is an inter-thread operation

本文关键字:操作 线程 什么      更新时间:2023-10-16

我一直在读一本关于c++中多线程的书,我真的很困惑线程间这个术语到底意味着什么。起初我认为它是用来描述线程之间的通信的。但随着这本书的发展,它开始更松散地使用这个词,以至于我不再理解它的含义。以这个简短的为例

"线程间发生在之前"也与"先序后序"关系相结合:如果操作A在操作B之前排序,操作B在线程间发生-在操作C之前,则线程间发生A在C之前。类似地,如果A与B同步,B在C之前排序,则线程之间发生A在C之前。这两者加在一起意味着,如果您在单个线程中对数据进行一系列更改,则只需要一个与关系同步的线程,就可以在执行C的线程上的后续操作中看到数据。"空

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

在该上下文中,术语线程间并不与线程间通信的特定通道或方法绑定,而是与之前发生的的概念绑定。

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

如果操作A在操作B之前排序,而操作B线程间发生在操作C之前,则A线程间出现在C 之前

在以下代码中

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

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

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

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

因此,为了回答您的问题:线程间操作(不要与内部线程混淆,即在同一线程中)指的是线程之间的交互和同步(显式或隐式)。不要从共享记忆区域之类的角度来考虑它,因为它可能会阻碍你对所解释的概念进行推理。

"沟通"可能不是最好的思考方式……"互动"更好。如果线程A写入一个文件句柄,然后线程B关闭该文件句柄,他们是否进行了通信?不是这样,但是如果线程B在A向其写入之前关闭了句柄,那么由于它们之间的交互,写入将失败。

所以不要只把它看作是数据传输。线程通常需要相互协调,无论它们是否在通信,而协调最重要的方面是按照合理的顺序做事。由于线程是异步运行的,并且是以(实际上)不确定的顺序运行的,所以这不是一件微不足道的事情。因此,我们将重点放在这些简单但可组合的有序计算基元上。