我正在一台计算机上运行基于 JUCE 的多线程 OpenGL 应用程序的 3 个实例 - 每个实例都连接到单独的 X 显示器。主应用程序线程调用 XInitThreads
,然后调用 XOpenDisplay
以进行适当的显示。然后,将不同的线程用于主渲染循环。应用程序的 3 个实例依次初始化,以便在下一个启动时,其中一个实例完成图形设置。
在 80% 的情况下,一切都会正常启动,但有时在应用程序的第二个和/或第三个实例中,对 glXMakeCurrent
的第四次调用(这也是由与初始化连接的线程不同的线程进行的第一个调用)永远不会返回。 X 线程已初始化,线程正在使用锁,并且在调用 glXMakeCurrent
之前,X Display 通过 XLockDisplay
锁定(并在调用返回后解锁)。
我确保每个应用程序都使用正确的显示和上下文。如果它纯粹与多个线程访问同一显示连接的问题有关,那么第一个实例应该同样可能遇到此问题 - 但它永远不会。
有什么想法为什么 glXMakeCurrent
可能不会返回,即使它拥有对其 X 显示的独占访问权限?
请您参考如下方法:
事实上,我错了,问题似乎是由 JUCE OpenGL 上下文上缺少锁引起的。因此,正确获取了 X 显示锁,但它应该映射到的上下文(在问题情况下)被另一个线程同时访问,导致 glXMakeCurrent
死锁。