我一直在读一本关于c ++多线程的书,我对线程间术语实际意味着什么感到困惑。起初我以为它用于描述线程之间的通信。但随着这本书的进一步发展,它开始更宽松地使用这个术语到我不明白它意味着什么的程度。例如,采用这个简短的段落
“线程间发生 - 之前也与前面的顺序关系结合:如果操作A在操作B之前被排序,并且操作B在线程发生 - 在操作C之前,那么在线程发生 - 在C之前。类似地,如果A与B同步 - B在C之前被排序,那么A线程发生在C之前。这两者一起意味着如果您在单个线程中对数据进行一系列更改,则只需要一个同步 - 与执行C的线程上的后续操作可以看到数据的关系。“ 空
读完那段后,我正式失去了。这本书非常善于解释新术语,完全忘记了这一点。这让我觉得这是一个不需要解释的常用术语,这使得提出这个问题变得更加困难。那么有人可以花时间解释这个术语的实际含义吗?
答案 0 :(得分:1)
"通信及#34;也许不是考虑它的最佳方式......"互动"更好。如果线程A写入文件句柄,然后线程B关闭该文件句柄,它们是否通信?不是真的,但如果线程B在 A写入之前关闭句柄,那么由于它们之间的交互,写入将失败。
所以不要把它想象成数据传输。线程通常需要彼此协调,无论它们是否进行通信,协调的最重要方面是按照有意义的顺序进行操作。由于线程以异步方式和(实际上)非确定性顺序运行,因此这不是一件容易的事情。因此,在基本无序的环境中关注这些简单但可组合的有序计算原语。
答案 1 :(得分:1)
该上下文中的术语线程间不是绑定到线程之间通信的特定通道或方法,而是绑定到发生在之前的概念。
让我们举一下您引用的段落:
如果操作A在操作B之前被排序,并且操作B在线程发生 - 在操作C之前,则在线程发生 - 在C之前
在以下代码中
thread1
--------------
0x10: int a = 1;
0x11: sendResultToThread(a);
thread2
--------------
0x12: int c = getResultFromOtherThread();
简化没有数据竞争并假设这里涉及的指令的原子性,句子说如果操作0x10在0x11之前排序(并且在同一个线程中,因为它来自源代码之前)和操作0x11 < em>在多线程上下文中发生在之前(即,在执行0x12之前,0x12的内存效应对于0x12是可见的某种机制,并且还确保0x11将在其他情况下当多个线程交互时,总是在0x12之前暂时执行),然后在C之前发生0x10内部线程。
第二句可以得出类似的结论。
所以回答你的问题:线程间操作(不要与内部线程混淆,即在同一个线程中)指的是交互和同步(线程之间的显式或隐式)。不要在共享内存区域等方面考虑它,因为它可能会阻碍您对所解释概念的推理。