I know XInitThreads()
将允许我从主线程以外的线程调用 X 服务器,如果我想使 Xlib 中的并发线程支持是必要的使用 Qt 从辅助线程调用 OpenGL http://doc.qt.digia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications。我对我的应用程序有这样的需求,但在非常罕见的情况下。不幸的是, XInitThreads() 需要在应用程序执行的一开始就被调用,因此无论我是否需要它来执行特定的运行,都会影响它(在运行应用程序之前我无法知道是否需要多线程 OpenGL)支持与否)。
我非常确定,如果我无用地调用 XInitThread(),应用程序的整体行为将保持不变,但编程就是权衡,而且我非常确定多线程支持不是 Xlib 的默认行为是有原因的。
手册页 http://www.x.org/archive/X11R6.8.2/doc/XInitThreads.3.html说建议单线程程序不要调用这个函数,但是没有说为什么。调用 XInitThreads() 时有何权衡?
它创建一个全局锁,并且在每个显示器上创建一个锁,因此每次调用 Xlib 都会执行一次锁定/解锁。如果您改为执行自己的锁定(使用自己的锁一次将 Xlib 使用保持在单个线程中),那么理论上您可以通过获取锁、一次执行大量 Xlib 操作,然后删除来减少锁定开销你的锁。或者在实践中,大多数工具包使用的模型根本不锁定,只是要求应用程序仅在主 UI 线程中使用 X。
由于许多 Xlib 调用都是阻塞的(它们等待服务器的回复),锁争用可能是一个问题。
在显示上锁定每个 Xlib 调用也存在一些语义上的困难;在线程 A 上的每个 Xlib 调用之间,理论上可以在线程 B 上进行任何其他 Xlib 调用。因此,线程可以在混淆显示状态方面相互干扰,即使它们一次只有一个发出 Xlib 请求。也就是说,XInitThreads() 正在防止由于并发显示访问而导致的崩溃/损坏,但它并没有真正考虑让多个线程共享 X 服务器连接的任何语义考虑。
我认为需要从并发显示访问中获得自己的语义意义是人们不关心 XInitThreads 每 Xlib 调用锁定的原因之一。因为无论如何它们最终都会获得应用程序级或工具包级的锁。
这里的一种方法是在每个线程中打开一个单独的显示连接,这可能有意义,具体取决于您正在做什么。
另一种方法是使用较新的 xcb API 而不是 Xlib; xcb 从头开始设计为多线程和非阻塞。
从历史上看,某些 OS/Xlib 版本中的 XInitThreads() 也存在一些错误,尽管我不记得任何具体细节,但我确实记得看到过这些错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)