安全跨线程信号/槽 C++

2024-03-27

似乎唯一为 Signal 类和槽中调用的内容提供安全跨线程信号的实现是 QT。 (也许我错了?)。

但我不能在我正在做的项目中使用QT。那么我如何从不同的线程提供安全的 Slots 调用(例如使用 Boost::signals2)?插槽内的互斥体是唯一的方法吗?我认为 Signals2 会保护自己,但不会保护插槽内所做的事情。

Thanks


您可以结合 boost::bind 和 boost ASIO 来创建跨线程调用。

# In Thread 2
boost::asio::io_service service;
boost::asio::io_service::work work (service); // so io service won't stop if there is no work 
service.run() # starting work thread

# In Thread 1
service.post (boost::bind (&YourClass::function, &yourClassInstance, parameter1, parameter2))

线程 2 将进入循环并执行您的绑定函数。我认为您也可以将 Boost::Signals2 调用放入此循环中。

但请注意:如果进行跨线程信号发送,请确保目标对象在调用时仍然存在。您可以通过删除目标析构函数中的所有连接(而不是其基类析构函数中的所有连接,另请参阅信号可追踪类 http://www.boost.org/doc/libs/1_39_0/doc/html/boost/signals2/trackable.html)

我不太喜欢 Boost::Signals2 ,因为它的堆栈跟踪和编译时间很长(博客文章 http://www.cgvis.de/content/?p=71).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全跨线程信号/槽 C++ 的相关文章

随机推荐

  • popToRootViewControllerAnimated 并释放所有视图

    我有一个 UINavigationController 它要求提供一些信息 用户导航直到最后 一旦到达那里 他们就可以接受或取消所有已输入的数据 他们选择哪个选项并不重要 因为他们总是会使用 UINavigationController p
  • 统一更新:使用本地文件的更新更新私有存储库(重构、重命名、更新)并从原始存储库获取定期更新

    我刚刚开始学习 Windows 上的 GitHub CLI 工具 认为我是新手 我有一个如下所示的用例 在深入探讨之前 让我先总结一下 我的用例是 克隆一个开源项目 它更新 定期 即创建它的本地副本并进行修改 包括 重命名文件和文件夹 将更
  • 准备重用

    有人可以告诉我如何使用prepareForReuse吗 我已经搜索了几个小时并阅读了开发文档 在扩展 UITableViewCell 的自定义单元中 我有prepareForReuse 方法及其被调用 但我该如何处理它 存在渲染问题 我这样
  • 有没有办法让无线电组水平布局?

    我在单选按钮组内有 2 个单选按钮 现在它们垂直排列 我尝试将它们放入水平容器中 但没有用 有没有办法让一组单选按钮水平排列
  • 在当前位置插入文本 TINYMCE IE9

    如何将文本插入到tinyMce编辑器的当前位置 它在 Chrome FF Safari 中完美运行 但在 IE 中它始终从文本区域的顶部开始 我目前执行以下操作 tinyMCE execCommand mceInsertContent fa
  • 如何在c中创建一个n维数组

    我正在考虑编写一个函数 它接受 n 个参数并使用这些参数作为维度返回一个 n 维数组 现在我意识到一维和二维数组很容易用指针实现 对于二维数组 片段将类似于 标准方式 int x int temp x int malloc m sizeof
  • TCP SOCKET 句柄可以继承吗?

    在 Windows 上 大多数类型的句柄都可以由子进程继承 期望 TCP 套接字也可以被继承 但是 当安装某些分层服务提供商时 这不会按预期工作 赛门铁克的 PCTools 等 A V 产品曾经导致我们的客户应用程序出现问题 按照微软构建W
  • 重构 AutoHeightWebView 库以获取在单独的浏览器中打开的超链接

    我有一个已升级的 React Native 应用程序 回到旧时代 如果您访问一篇新闻文章 该文章有超链接 并且您单击了超链接 它会将您重定向到手机浏览器并打开那里的链接 但它不再这样做 因为我们必须升级react native autohe
  • 警告:条件中的字符串文字

    使用下面的第一段代码我收到两条警告消息 warning string literal in condition x2 if input N n do this else input L l do this 而不是使用它 这不会导致任何警告
  • 如何在 VS2012 MVC4 项目中设置 Ext.NET 2.0?

    我非常怀疑我的问题是否会得到解答 但我会在这里尝试 因为我的挫败感如此之高 也许这会帮助我自己降低它们 所以 我想做的是 从头开始安装 VS2012 好吧 点击 exe 即可开始 创建一个新的MVC4项目 使用 Razor View Eng
  • 条件变量初始化的Pythonic方式是什么?

    由于 Python 的作用域规则 所有在某个作用域内初始化的变量此后都可用 由于条件不会引入新的作用域 因此不一定需要其他语言中的构造 例如在该条件之前初始化变量 例如 我们可能有 def foo optionalvar None some
  • AngularJS 文件拖放到指令中

    这个例子几乎完成了我想在 Angular js 中移植的功能 HTML5 文件 API http html5demos com file api view source 我一直在尝试用 google 搜索一些指令示例 但是我发现旧示例大量使
  • 选择具有特定属性的元素

    我的输入按钮没有任何类或 id 并且有 onclick attr 如下所示
  • SQL Server 闩锁及其对性能问题的指示

    我试图了解我们的数据库 SQL 2008 的潜在性能问题 特别是一个性能计数器 SQLServer Latches Total Latch Wait Time Total Latch Wait Time ms 我们看到数据库响应时间变慢 我
  • 隐藏打开的 Excel 文件

    这是我的问题 我开发了一个程序 它使用 Microsoft Excel COM 组件来读取 写入 Excel 文件 嗯 我的应用程序运行良好 但是当我在程序运行时直接使用 Excel 打开另一个文件时 我的应用程序使用的文件会出现在 Exc
  • 可以在同一台机器上安全地运行多个 Android 模拟器并使用套接字进行通信吗?

    我想在一台笔记本电脑 最坏情况 或专用网络上的多台计算机上模拟一小群 Android 设备 这是为了测试 Android 上的通信和进程迁移 有没有一种安全的方法可以从 Eclipse 下的给定应用程序识别并启动特定的模拟器 我最近安装了
  • 将 JSON 数据存储在 MySQL 表中

    我在使用 NodeJS 在 MySQL 表中存储 JSON 数据时遇到问题 JSON 数据如下所示 header file1 0 file2 1 subfiles subfile1 true subfile2 true response n
  • qVariantValue 是“QT_DEPRECATED” - 替代品是什么?

    我需要将 Qt 遗留代码从 4 转换为 5 1 现在我在 Visual Studio 2010 中出现编译错误 SingleItem item qVariantValue
  • 通过 Javascript WeakMaps 进行垃圾收集缓存

    我想在 JavaScript 中缓存大对象 这些对象是通过键检索的 缓存它们是有意义的 但它们不会一次全部放入内存中 因此我希望在需要时对它们进行垃圾收集 GC 显然更了解 使用以下命令创建这样的缓存非常简单WeakReference or
  • 安全跨线程信号/槽 C++

    似乎唯一为 Signal 类和槽中调用的内容提供安全跨线程信号的实现是 QT 也许我错了 但我不能在我正在做的项目中使用QT 那么我如何从不同的线程提供安全的 Slots 调用 例如使用 Boost signals2 插槽内的互斥体是唯一的