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

Why the same thread must be used?

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

所以当有人说 "You must only call methodX() on the same thread that created ObjectY" 或 "The context must first be associated with threadX before calling methodY"...

引擎盖下发生了什么?

如何执行?

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

大多数 windowing 系统对于线程与(直接)操作 window 的代码之间的交互都有相当具体的规则。对于大多数典型情况,"outside world" 发送消息,处理这些消息并直接操作目标 window 的代码在(一个)正确的线程中运行,这一事实可以相当透明地处理。

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

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

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