多线程X11应用程序和OpenGL

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应用程序的更多信息,我应该以不同的方式处理我的事件吗?

dat*_*olf 3

众所周知,Xlib 有几个无法修复的运行时问题,这些问题在并发访问情况下表现出来。我猜你正在遇到其中之一。

这是创建 Xcb 的首要原因之一:修复 Xlib 的问题。GLX 是针对 Xlib 指定的,因此对于 OpenGL 来说,这似乎是一个阻碍。然而,有一个 Xlib 围绕 Xcb,人们可以安全地使用它与 GLX 交互,并且仍然在程序的其余部分使用 Xcb: http: //xcb.freedesktop.org/opengl/

我看到两种可能的解决方案:

  1. 放置一个XLockDisplay/Mutex XNextEvent,GLX 调用每个互斥体;您不必锁定普通的 OpenGL,只需锁定前缀为 的函数即可glX...

  2. 使用 Xcb 获得运行时正确的行为,并按照我上面链接的指南使其与 OpenGL/GLX 一起使用。