XInitThreads() 的缺点是什么?

2023-12-24

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(使用前将#替换为@)

XInitThreads() 的缺点是什么? 的相关文章

  • 在多线程程序中使用 EF 有什么好的建议吗?

    您对于在多线程程序中使用 EF 有什么好的建议吗 我有两层 用于读 写数据库的 EF 层 一个多线程服务 它使用我的实体 读 写 并进行一些计算 我在框架中使用任务并行库 如何同步每个线程中的对象上下文 您知道让它发挥作用的好模式吗 好的建
  • 多线程 C# 应用程序中的惰性单例

    我正在开发一个使用 WCF Web 服务的多线程 C 应用程序 与 Web 服务的连接将有一个特定的超时时间 我们可以定义该超时时间 之后连接将关闭 我希望使用单例类来存储与 Web 服务的连接 我试图获取实例如下 CLazySinglet
  • Java 线程何时达到“死亡”状态

    在 Java 中 Die 是线程的状态之一 什么原因导致线程进入这种状态 来自线程API http java sun com javase 6 docs api java lang Thread html 这是一个完整的列表 如果 run
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • Tweepy 连接中断:IncompleteRead - 处理异常的最佳方法?或者,线程可以帮助避免吗?

    我正在使用 tweepy 处理大型 Twitter 流 关注 4 000 多个帐户 添加到流中的帐户越多 出现此错误的可能性就越大 Traceback most recent call last File myscript py line
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • Android CountDownTimer 类滞后主线程

    我正在尝试使用 android os CountDownTimer 通过文本视图字面显示倒计时器 以达到健身目的 我遇到的问题是计时器似乎在主线程上运行时遇到问题 即倒计时将跳 2 4 秒并且明显 滞后 计时器应处于无限循环状态 直到停止按
  • 如何对请求使用线程? [复制]

    这个问题在这里已经有答案了 您好 我正在使用请求模块 我想提高速度 因为我有很多网址 所以我想我可以使用线程来获得更好的速度 这是我的代码 import requests urls http www google com http www
  • 为什么我们不能在当前队列上使用dispatch_sync?

    我遇到了一个场景 我有一个委托回调 它可能发生在主线程或另一个线程上 并且直到运行时我才知道是哪个 使用StoreKit framework 我还需要在该回调中更新 UI 代码 该回调需要在函数执行之前发生 所以我最初的想法是拥有一个如下所
  • 经典的生产者消费者线程

    In the 经典生产者消费者问题 http en wikipedia org wiki Producer consumer problem 制片人什么时候睡觉itemCount BUFFER SIZEamd 宕机时会再次醒来 但有一次it
  • 跟踪 C#/.NET 任务流

    我正在尝试找到一种方法来跟踪异步任务执行流程 以便轻松理解任务 启动它的原始流程是什么 我主要需要它来记录 调试和保留特定执行流的堆栈跟踪 例如 如果我的服务器有来自多个 IP 的许多客户端 并且服务器需要为每个客户端执行一个涉及许多异步操
  • C# 中方法的时间限制

    我有一个游戏框架 其中有一个实现 IBotInterface 的机器人列表 这些机器人是由用户定制的 唯一的限制是它们必须实现接口 然后游戏会调用机器人中的方法 希望是并行的 来处理各种事件 例如 yourTurn 和 roundStart
  • 其他线程可以修改线程本地内存吗?

    假设我有以下声明 thread local std atomic
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何一次运行多个后台线程任务?

    我正在尝试循环遍历包含 2016 年 10 月日期的 String 对象数组 这意味着 31 个 String 对象 2016 年 10 月 1 日 2016 年 10 月 31 日 对于每个对象 我想从数据库检索一些数据并附加返回值 也是
  • 如何在 iPhone 应用程序中运行进程而不阻塞用户界面

    我正在 iPhone 上访问照片库 需要很长时间才能导入我在应用程序中选择的图片 如何在辅助线程上运行该进程 或者我应该使用什么解决方案来不阻塞用户界面 我在这里使用 PerformSelectOnBackground 或 GCD 对示例代
  • 确保适配器的内容不会从后台线程修改,而仅从 UI 线程修改

    我有一个带有 EditText 名为 filtro 和 ListView 名为 list view 的活动 当用户插入文本时 适配器应该刷新 如果我多次更改文本 则会发生崩溃 然后显示消息 确保适配器的内容不是从后台线程修改 而是仅从 UI
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a

随机推荐

  • AngularJS中页面刷新或移动到另一个页面后保留下拉值

    让我解释一下我的情况 我的主页中有下拉列表 如果更改了下拉列表 则数据的更改取决于下拉列表的值 如果我刷新页面或移至另一个页面 下拉列表将自动清除 我想在刷新页面或移动到另一个页面后保留下拉列表值 我尝试这样做 但这没有帮助 HTML
  • 将方法转换为静态方法时的内存使用情况

    我开始使用 Resharper 它指示何时使用一种方法could设为静态 将数百个方法转换为静态方法会在很长一段时间内增加内存占用吗 否 更改为静态方法对内存没有影响 第一次引用类型 无论是静态还是非静态 时 都会初始化所有静态成员并运行静
  • 为 Caffe 生成 LMDB

    我正在尝试使用 caffe 我正在使用 python 包装器 构建用于显着性分析的深度学习模型 但我无法理解如何为此目的生成 lmdb 数据结构 我已经浏览了 Imagenet 和 mnist 示例 我明白我应该以以下格式生成标签 my t
  • 如何添加日期时间字段和时间字段

    我必须添加time对现有的价值datetime在 SQL Server 2012 中使用 T SQL 的值 我在想DATEADD http msdn microsoft com en us library ms186819 aspx功能它可
  • 如何在node.js上运行.php脚本

    我使用 wamp 服务器和 node js 来运行我的应用程序 server js 但是当我想执行 php 脚本时 我总是收到错误 POST http localhost 8080 login php 404 Not Found 服务器 j
  • 从 VBA 定义的宏创建 PowerPoint 加载项

    因此 我在 PowerPoint 演示文稿中创建了一个宏 并且希望其他人可以轻松使用该宏 根据我收集的信息 最好的方法是创建一个Add in 我看到几篇文章指出要执行以下操作 但我仍然遇到问题 打开新的 PowerPoint 演示文稿 使用
  • 如何从一个项目创建多个apk?

    我有一个 android 项目 我需要在其中创建多个 apk 每个 apk 之间的唯一区别是包名称 例如 com my package name 和应用程序字符串名称 因此我可以在一台设备上安装该应用程序的多个实例 有更好的方法吗 我考虑过
  • PL/SQL:有什么技巧可以避免对象的克隆吗?

    如果我们将一个对象变量分配给 pl sql 中的其他对象变量 则该对象将被克隆 因为 pl sql 不支持引用 例如 以下代码将打印两个不同的句子 create or replace type cla as object class wou
  • 在 Firebase Storage Swift 中使用图像引用数据库中的 Firebase 用户

    通常我可以在网上找到这个问题的答案 但由于它太新了 我一直遇到麻烦 当我让用户登录应用并为其个人资料选择 4 5 张图片时 如何将这些图像存储在 Firebase 存储中 并在 Firebase 数据库中将这些图像引用给该用户 Thanks
  • 如何在php中制作活动导航栏?

    您好 我正在尝试使我的导航栏在 php 中处于活动状态 以便用户可以知道他们所在的页面 我是php新手 对它了解不多 那么如何在此代码中添加 class active 来创建活动导航栏并在同一 index php 页面中显示所有页面 a h
  • ValueError:尺寸不匹配

    I use SciPy http scipy org and scikit学习 http scikit learn org stable 训练并应用多项式朴素贝叶斯分类器进行二进制文本分类 准确地说 我使用该模块sklearn featur
  • 序列化复杂类型 System.Nullable

    我想序列化 DateTime 以便当 DateTime 为 null 时我无法获取标签本身 我还设置了为上面指定的 bool 值 但我的问题是 DateTime 是值类型 它永远不会为 null 因此指定的 bool 值将始终为 true
  • Chrome 中的 Javascript 调试 - 对象名称?

    不知道 下图中圈出的东西 叫什么 使我的问题很难找到答案 下图中我圈出的东西叫什么名字 实际上是什么 myObject myFunction 是无关紧要的 我希望能够将其写到控制台 我尝试过以下方法 console log sp outpu
  • Spring Boot 2 未序列化 LocalDateTime

    我最近尝试使用 spring boot 2 实现一个微服务 现在 每当我尝试返回一个包含java time LocalDateTime从我的 REST 服务中 LocalDateTime 被序列化为整数数组 就像这样 id 5bf1425f
  • JDBC SQL 数据库被锁定?

    我正在编写一个使用本地 SQL 数据库来存储数据的程序 我正在使用这里找到的驱动程序 https bitbucket org xerial sqlite jdbc https bitbucket org xerial sqlite jdbc
  • 在 Web 项目中使用 SOLR 的最佳方法是什么?

    好吧 我对 SOLR 和 Lucene 完全陌生 但已经让 Solr 在 Tomcat 6 x 下开箱即用地运行 并且刚刚浏览了一些基本的 Wiki 条目 我有几个问题 也需要一些建议 Solr 可以索引文件 XML CSV 中的数据 也可
  • Apple Watch 应用程序可以与 Apple TV 交互吗?

    我正在寻找解决方案 甚至是关于在之间共享数据 发送信号等的可能性的线索Apple Watch应用程序和Apple TV app 就我而言 我有一个应用程序可以使用以下方法进行一些计算Apple Watch我希望这些计算能够对Apple TV
  • 如何让乘客配置重新启动应用程序正常工作?

    Ubuntu 14 04 上的 Rails 4 1 带有 rbenv 和 ruby 2 2 1 将 capistrano 与 capistrano passenger gem 一起使用 但最后重新启动失败 INFO 8213c63a Run
  • 在Python中向信号添加噪声

    我想向我在 Python 中模拟的 100 个 bin 信号添加一些随机噪声 使其更加真实 在基本层面上 我的第一个想法是逐个容器 生成某个范围内的随机数 然后从信号中添加或减去该数字 我希望 因为这是Python 可能有一种更智能的方法通
  • XInitThreads() 的缺点是什么?

    I know XInitThreads 将允许我从主线程以外的线程调用 X 服务器 如果我想使 Xlib 中的并发线程支持是必要的使用 Qt 从辅助线程调用 OpenGL http doc qt digia com qq qq06 glim