为什么必须使用相同的线程?

时间:2015-12-22 09:00:09

标签: language-agnostic thread-safety

在各种库中,某些操作必须发生在发生另一个操作的同一线程上。一些例子包括Swing EDT和OpenGL。

所以,当某些东西出现类似"你必须只在创建ObjectY"的同一个线程上调用methodX();或者"在调用methodY" ...

之前,必须首先将上下文与threadX相关联

引擎盖下发生了什么?

如何执行?

为什么要这样做?例如即使对象正在进行任何操作,为什么我不能从另一个线程发送命令?

1 个答案:

答案 0 :(得分:1)

大多数窗口系统都有关于线程与(直接)操作窗口的代码之间的交互的相当具体的规则。对于大多数典型情况,由于“外部世界”发送消息,处理这些消息并直接操作目标窗口的代码在(一个)右侧线程中运行,因此处理相当透明。

我猜我们在这里看到了相同限制的表现。不同之处在于OpenGL和Swing EDT在函数调用而不是要发送的消息方面公开了功能。这些函数直接操作底层窗口的方式是典型的窗口系统只需要从正确的线程发生 - 因此,你最好只从正确的线程中调用这些函数。

就强制执行而言:至少在我见过的大多数系统中,“强制执行”包括当您执行错误操作时应用程序崩溃。如果你很幸运,你可能会从操作系统中得到一条很好的,有用的消息,说你从错误的线程中调用了函数X(虽然它所引用的函数X,可能是你从未直接调用的函数,来自任何线程) )。在更常见的情况下,您将收到类似segmentation fault attempting to write address 0x12345678的错误,但没有任何迹象表明您根本没有触发错误。

至于为什么要这样做:如上所述,它或多或少是由底层窗口系统强制执行的。如果你想更进一步,问他们为什么要求它,我猜它主要是简单和速度的问题。要求与窗口的所有直接交互都通过单个线程避免在任何地方处理并发性。添加允许多个线程同时使用它们所需的所有互斥锁(等等)会导致开发速度慢得多,并且(可能)执行速度也会慢一些。