如何使用 OpenMP 在 C++ 中实现监视器?
Posted
技术标签:
【中文标题】如何使用 OpenMP 在 C++ 中实现监视器?【英文标题】:How to implement a monitor in C++ using OpenMP? 【发布时间】:2017-10-20 13:20:06 【问题描述】:我正在使用 C++ 编写Producer-consumer problem,使用 OpenMP 时实现监视器的方法是什么?
我在 OpenMP 中找不到像 conditional_variable 这样的东西,而且我无法在某些条件下实现等待/通知,例如在***示例中。
【问题讨论】:
多说一些关于你想如何在 OpenMP 中解决 P-C 问题,对我来说这不适合 P-C? 你到底想做什么?这是一个学习练习,看看您是否可以仅使用 openMP 构造来实现条件变量? (这将是非常重要的。)您必须使用缺少 STL 条件变量的古老系统吗?你没听说过STL吗?输入一点。 【参考方案1】:我不认为 OpenMP 提供任何使用条件变量的方法,因此并不真正适合您的特定目的。
OpenMP 不为条件变量提供任何构造。它的目的更适合多线程科学应用程序,在这种应用程序中,您只需将问题划分为小块,而无需考虑线程,因为同步由 OpenMP 的运行时库负责。
一些实现使用 pthreads 作为后端,因此可以解决并使用pthread_cond
系列函数。但是,这很容易出现死锁(因为您无法控制线程的创建和连接方式),即使使用相同工具的不同版本也可能无法移植。
在你的情况下,我会直接使用 C++ 标准线程库,它已经包含了实现生产者消费者队列所需的一切。如果您仍想坚持并行编程框架,请查看 Intel Thread Building Blocks,因为它已经实现了这种Concurrent Queues。
【讨论】:
我完全同意,但“不要那样做”不是问题的答案。这个问题太大了,无法在这里回答。 我可能不够清楚,但我的回答更像是:“你不能在 OpenMP 中完全做到这一点,最好使用其他选项”。不过感谢您的反馈。我将更新答案以澄清这一点。 我认为我可以在openMP中完全实现互斥和条件变量,但我不打算尝试。 这正是我的观点。你需要实现它,不是提供给你的东西。 OpenMP 并不意味着用户可以在它之上做事。我已经使用 OpenMP 和类似的共享内存编程模型工作了几年。这并非不可能,但根本不值得尝试。以上是关于如何使用 OpenMP 在 C++ 中实现监视器?的主要内容,如果未能解决你的问题,请参考以下文章