【问题标题】:Cross thread call a.k.a run on main/UI thread from other thread without dependencies needed跨线程调用 a.k.a 在其他线程的主/UI 线程上运行,无需依赖
【发布时间】:2018-05-10 09:56:27
【问题描述】:

我正在使用一些 c++ 移动产品,但我需要我的应用程序主线程在后台线程上执行一些繁重的工作并在主线程上运行时仍然运行而没有任何阻塞。但我意识到 C++ 线程 API 中没有 runOnMainThread/runOnUIThread。我试图找出问题并发现需要依赖库,或者创建自己的线程事件队列。虽然很好,但我想有一个可以运行OnUIThread的行为。

【问题讨论】:

  • 你无法实现没有依赖关系的 UI。无论您使用什么库,总有一种方法可以在 UI 线程上调用代码。必然如此,因为 UI 从来都不是线程安全的。如果它真的不可用,那么只需使用更好的。通过描述您如何实现 UI(命名操作系统或库)来获得对您有实际帮助的答案。
  • 嗨,Hans,我已经完成了一个名为 github.com/Taymindis/NonBlockpp 的项目,它每次都能安全地向主线程发出信号。
  • @u 那是java,我的lib是c++,建议大家试试。如果您遇到任何错误。不要犹豫,一起讨论

标签: c++ c++11 game-engine nonblocking android-runonuithread


【解决方案1】:

它是如何工作的:上面提到的库创建一个计时器,安装一个SIGALRM 信号处理程序,并在触发信号时调度排队的任务。这允许在主线程上处理任务,即使它很忙。但是 POSIX permits only a small set of async-signal-safe functions 将在信号处理程序内部调用。在信号处理程序中运行任意 с++ 代码违反了该限制,并使应用程序处于无可救药的厄运状态。

【讨论】:

  • 有点迂腐——但不是问题的真正答案;)
  • 您的意思是信号处理程序范围有一些限制吗?请给我一些样品。
  • @Oktaheta 您可以在我链接的页面上找到可以从信号处理程序安全调用的函数列表。
  • @VTT 到目前为止,我已经用调用 http 的 c++ 移动程序进行了测试,没有问题,我也运行了 strsss 测试。我只是不明白信号处理程序中的限制是什么意思,因为我的库是 SIGALRM 函数链,它每次只允许一个,它具有原子锁定
  • @Oktaheta 好的,您检查过我链接页面上的异步信号安全功能列表了吗?调用不在该列表中的任何内容都是不安全的。
【解决方案2】:

经过一些研究和开发,我创建了一个名为NonBlockpp的库

它是一个小型 c++ 库,允许 c++ 移动应用程序能够在后台处理繁重且耗时的任务并再次返回主线程,它已经过测试并触发了主线程事件。

它还允许保存任务并在以后触发它们,所有任务都没有相互阻塞和线程安全。

它是如何工作的:

如果您有任何疑问或建议,请随时提出问题,我们可以一起讨论。

【讨论】:

  • 在写上述内容之前,您是否查看过std::future 等? en.cppreference.com/w/cpp/thread/future 代码图片也几乎无法使用。
  • “它是如何工作的”部分不知何故根本没有解释它是如何工作的。为什么this_thread::sleep_for下面的调用栈中会出现函数?
  • 让工作线程回调到java代码中不是更好的方法吗?这样您就可以在上下文中调用 runOnMainThread 来处理结果;而不必轮询以查看任务是否完成?
  • @Richard,future 阻塞了主线程,如果你总是为你做的每一个后台任务循环 isReady,它可能需要很多努力
【解决方案3】:

由于信号处理程序可能不安全使用,该项目已从信号纠正到 pollEvent。

请看看新的变化。

NonBlockpp

Usage

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多