我正在尝试使用 libx11 创建一个多线程 opengl 应用程序 - 每个窗口一个单独的线程和一个管理器线程。
我在管理器线程中有一个事件循环:
while(true)
while(XQLength(mPlatformData->display)){
XNextEvent(mPlatformData->display, &event);
std::cout << "event" << std::endl;
}
}
对于单线程应用程序来说,这是一个很棒的事件循环,但是对于这种多线程设置,奇怪的事情发生了。
当我创建一个窗口时,我需要禁用事件队列,否则 GLXMakeCurrent 将挂起 - 我的整个线程停止,什么都不做。
我在网上找不到很多关于多线程 X11 应用程序的信息,我应该以不同的方式处理我的事件吗?
最佳答案
众所周知,Xlib 在并发访问情况下存在几个无法修复的运行时问题。我猜您正好遇到了其中之一。
这是最初创建 Xcb 的原因之一:修复 Xlib 的问题。 GLX 是针对 Xlib 指定的,因此当涉及到 OpenGL 时,这看起来像是一个障碍。然而,有一个围绕 Xcb 的 Xlib,可以安全地使用它来与 GLX 交互,并且仍然在程序的其余部分使用 Xcb:http://xcb.freedesktop.org/opengl/
我看到两种可能的解决方案:
在
XNextEvent
周围放置一个XLockDisplay
/Mutex,GLX 分别调用;您不必为普通的 OpenGL 锁定,只需为前缀为glX...
的函数锁定。使用 Xcb 获得运行时正确的行为,并按照我上面链接的指南使其与 OpenGL/GLX 一起工作。
关于multithreading - 多线程 X11 应用程序和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547298/