什么是线程间操作
What is an inter-thread operation
我一直在读一本关于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向其写入之前关闭了句柄,那么由于它们之间的交互,写入将失败。
所以不要只把它看作是数据传输。线程通常需要相互协调,无论它们是否在通信,而协调最重要的方面是按照合理的顺序做事。由于线程是异步运行的,并且是以(实际上)不确定的顺序运行的,所以这不是一件微不足道的事情。因此,我们将重点放在这些简单但可组合的有序计算基元上。
- 为什么一个向量上的多线程操作很慢
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 当其他线程正在编写线程安全时,我是否必须互斥读操作
- 在可拆卸线程完成操作时取消分配内存
- 在接收 SIGINT 操作时适当地关闭多线程 c++ 应用程序
- C++多线程操作比单线程慢
- 标准::atomic_应该如何...<std::shared_ptr>用于线程安全类的复制和移动操作?
- 在std ::线程中升级ASIO阻止操作,而不是使用异步方法
- 发生哪些线程异步操作
- Boost.Asio:由于线程退出或应用程序请求,I/O 操作已中止
- 线程在成功pthread_create之后不执行任何操作
- 如何在没有条件变量的情况下阻止线程中的操作,并在Linux中根据信号恢复操作
- 读取和写入操作的线程安全性C++
- 如何使C++endl操作器线程安全
- 如何实现多线程异步操作
- 从命令行构建x64 C++项目说:此操作应该只在UI线程上进行
- 多线程文件保存操作
- 使用操作当前对象的线程是否安全
- 如何使生成的线程拖延足够长的时间以使生成线程执行某些操作
- 比较操作线程对 std::atomic 变量是安全的吗?