multithreading - 多线程 X11 应用程序和 OpenGL

标签 multithreading opengl thread-safety x11

我正在尝试使用 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/

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

  1. XNextEvent 周围放置一个 XLockDisplay/Mutex,GLX 分别调用;您不必为普通的 OpenGL 锁定,只需为前缀为 glX... 的函数锁定。

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

关于multithreading - 多线程 X11 应用程序和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547298/

相关文章:

Java 股票程序随机多线程

C 在多线程程序中在哪里定义互斥体?

c++ - 哪种是产生线程的最佳方法?

c++ - 使用 g++ 编译器的 OpenGL C++,无法在 Windows 10 上找到 GLFW(无 Visual Studio)

java - 通过示例建模 : by Thomas Funkhouser

android - Android SDK 的 CircularArray 线程安全吗?

java - SimpleDateFormat - 不安全,但究竟是为什么呢?

ios - 在 iOS 上使用单独的线程联网

ruby - 如何知道 ruby​​ 中什么不是线程安全的?

algorithm - 为自动索具找到重量绘画公式的因素