c++ - 使用 OpenMP 在程序中处理 GUI 线程

标签 c++ user-interface gcc pthreads openmp

我有一个 C++ 程序,它使用 OpenMP 并行执行一些冗长的计算。现在该程序还必须响应用户输入并更新一些图形。到目前为止,我一直从主/GUI 线程开始我的计算,小心地平衡工作负载,这样既不会太短以掩盖 OpenMP 线程开销,也不会太长导致 GUI 变得无响应。

很明显,我想通过同时运行所有内容来解决这个问题。据我所知,OpenMP 2.5 没有为此提供良好的机制。我认为它不适用于此类问题。我也不想将整个核心专用于 GUI 线程,它只需要 <10% 的核心来完成它的工作。

我想也许将计算分离到一个单独的 pthread 中来启动并行结构是解决这个问题的好方法。我对此进行了编码,但从 pthread 调用时 OpenMP 崩溃,类似于此错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36242 .请注意,我并没有尝试一次从多个线程启动并行构造,在整个程序中,OpenMP 仅在一个 pthread 中使用。

看来我既不能使用 OpenMP 来同时安排我的 GUI 工作,也不能使用 pthreads 让并行结构同时运行。我正在考虑在一个单独的线程中处理我的 GUI 工作,但在我的情况下这恰好相当丑陋,并且由于我使用的各种库而实际上可能无法工作。

这里的教科书解决方案是什么?我确信其他人在需要同时处理 GUI/网络等的程序中使用了 OpenMP,但我无法使用 Google 或 OpenMP 论坛找到任何信息。

谢谢!

最佳答案

没有教科书式的解法。 OpenMP 的教科书应用程序是非交互式程序,它们读取输入文件、进行大量计算并写入输出文件,所有这些都使用相同大小的线程池 ~ #CPUs 在你的 super 计算机中。它不是为交互和计算代码的并发执行而设计的,我认为规范不保证与任何线程库的互操作。

撇开理论不谈,您似乎在 OpenMP 的 GCC 实现中遇到了错误。请向 GCC 维护者提交错误报告,暂时寻找不同的编译器或在单独的进程中运行您的 GUI 代码,通过某种 IPC 机制与 OpenMP 程序通信。 (例如,套接字上的异步 I/O。)

关于c++ - 使用 OpenMP 在程序中处理 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5279904/

相关文章:

c - 为什么 scanf() 会导致此代码中的无限循环?

gcc - 叮当说 "cstdlib file not found"

c++ - 在 C++ 中将 TCP 服务器数据包保存到文件

c++ - 无法编译简单的C++17程序

java - 如何从主类加载 Java GUI 类?

java - 不可序列化异常 - 组布局

c++ - 在 QTableView 的单个单元格中显示多个图标

c++ - 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异

c++ - 让类(class)与运营商合作的更简单方法?

虚拟继承时的C++构造函数顺序