OpenMP C++ 中的线程

Posted

技术标签:

【中文标题】OpenMP C++ 中的线程【英文标题】:Threads in OpenMP C++ 【发布时间】:2011-01-07 19:26:47 【问题描述】:

我需要在C++ OpenMP中实现C#线程效果..

Thread t=new Thread( func1 );
t.Start(); // Do something
// Do something else

请注意,父母或孩子都没有等待加入..

我可以在 C++ OpenMP 中执行此操作吗??

谢谢,

【问题讨论】:

据我了解,openMP 的全部意义在于编译器生成代码来为您生成多个线程。 如果我需要启动一个线程并且不等待它完成怎么办? 我不认为 OpenMP 是您在这里寻找的。任何标准线程库都可以做你正在做的事情。 OpenMP 用于自动并行化可并行化的代码部分。 【参考方案1】:

OpenMP 是比 C# 线程更高级别的线程库,通常用于几乎自动向串行应用程序添加一些线程。您可以通过使用 #pragma omp parallel 指令来实现与您想要的类似的东西,该指令将在多个线程中自动运行指令块中的代码。然后,您可以在此并行部分中调用该函数。

OpenMP 的优势在于,只需几个指令即可轻松地将线程添加到现有代码中。但是,我发现如果我想做任何复杂的事情(或者简单的事情),使用较低级别的线程库会更容易。

如果您想要与 C# 线程具有相似接口的东西,请查看 Boost.Thread 库。有了这个,你可以用几乎相同的语法做你想做的事:

#include <boost/thread.hpp>

//creates the thread object and starts the thread, returns immediately
boost::thread th(func1);

//...
//do something else
//...

【讨论】:

这意味着我要问的在 OpenMP 中是不可能的? 如果您不希望线程重新加入主线程,我认为这在 OpenMP 中会很困难。大多数 OpenMP 结构是完全包含所有并行操作的块,并且假设事物在块外是串行的(通过在块的末尾加入)。这使事情更容易理解并且不会搞砸,但会限制您可以做的事情。这并不是说 OpneMP 无法完成您想要的事情,我只是认为它会变得非常笨重。不过,我很久没有使用 OpenMP,所以可能有一个简单的方法我不知道。 最接近的是#pragma omp parallel sections,后跟#pragma omp parallel section 指令,让每个代码块在不同的线程中运行。但是,这会自动加入最后的线程。

以上是关于OpenMP C++ 中的线程的主要内容,如果未能解决你的问题,请参考以下文章

C ++中OpenMP中的有序线程ID

C++:OpenMP 中的私有静态变量

在C++中使用openmp进行多线程编程

在 Openmp (C++) 中销毁线程

如何不等待 OpenMP 中的其他线程?

NodeJS:具有多线程的本机 C++ 模块(openmp)