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