我正在使用Linux在C中创建一个多线程应用程序。
我不确定是否应该使用POSIX线程API或OpenMP API。
有什么优点和优点;是否使用?
修改
有人可以澄清两个API是否创建内核级或用户级线程?
答案 0 :(得分:65)
Pthreads和OpenMP代表两种完全不同的多处理范例。
Pthreads是一个用于处理线程的非常低级的API。因此,您对线程管理(创建/加入/等),互斥锁等具有极其细粒度的控制。它相当简陋。
另一方面,OpenMP 很多更高级别,更便携,并且不限制您使用C.它也比pthreads更容易缩放。一个具体的例子是OpenMP的工作共享结构,它允许您相对轻松地跨多个线程划分工作。 (另见维基百科的pros and cons list。)
也就是说,您确实没有提供有关您正在实施的具体计划的详细信息,或者您计划如何使用它,因此推荐使用另一个API是不可能的。
答案 1 :(得分:19)
如果您使用OpenMP,可以就像添加单个编译指示一样简单,并且您将有90%的方式使用线性加速来正确处理多线程代码。使用pthreads获得相同的性能提升需要做更多的工作。
但是像往常一样,你可以通过pthreads获得更大的灵活性。
基本上,这取决于您的应用程序。你有一个平凡的并行算法吗?或者你只是有很多你想要同时执行的任意任务?这些任务需要相互交谈多少钱?需要多少同步?
答案 2 :(得分:7)
OpenMP具有跨平台的优点,并且对某些操作更简单。它以不同的方式处理线程,因为它为您提供了更高级别的线程选项,例如循环的并行化,例如:
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
如果您对此感兴趣,并且可以选择C ++,我还建议Threading Building Blocks。
Pthreads是一个用于显式生成线程和同步的低级API。在这方面,它提供了更多的控制。
答案 3 :(得分:4)
这取决于两件事 - 您的代码库和您在其中的位置。关键问题是 - 1)&#34;您的代码库是否具有线程,线程池和控件原语(锁,事件等)&#34; 2)&#34;您是在开发可重用的库还是普通的应用程序?&#34;
如果你的库有线程工具(几乎总是建立在一些PThread的味道上),请使用它。如果您是图书馆开发人员,请花时间(如果可能)构建它们。值得一提的是,您可以将比OpenMP更精细,更先进的线程组合在一起。
相反,如果您需要时间或只是开发应用程序或第三方工具之外的东西,请使用OpenMP。您可以将其包装在几个宏中,并获得所需的基本并行度。
通常,OpenMP足以支持基本的多线程。一旦您开始直接在构建高度异步代码时管理系统资源,其易用性优势就会因性能和界面问题而变得非常容易。