我正在使用Linux在C中创建一个多线程应用程序.
我不确定是否应该使用POSIX线程API或OpenMP API.
使用任何一种的利弊是什么?
编辑:
有人可以澄清两个API是否创建内核级或用户级线程?
Oli*_*rth 19
如果您使用OpenMP,它可以像添加单个编译指示一样简单,并且您可以通过线性加速实现90%的正确多线程代码.使用pthreads获得相同的性能提升需要更多的工作.
但是像往常一样,你通过pthreads可以获得更大的灵活性.
基本上,这取决于您的应用程序.你有一个平凡的并行算法吗?或者你只是有很多你想要同时执行的任意任务?这些任务需要相互交谈多少钱?需要多少同步?
OpenMP具有跨平台的优点,并且对于某些操作更简单.它以不同的方式处理线程,因为它为您提供了更高级别的线程选项,例如循环的并行化,例如:
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
Run Code Online (Sandbox Code Playgroud)
如果您对此感兴趣,并且如果C++是一个选项,我还建议使用Threading Building Blocks.
Pthreads是一个用于显式生成线程和同步的低级API.在这方面,它提供了更多的控制.
小智 5
这取决于两件事——你的代码库和你在其中的位置。关键问题是 - 1)“您的代码库是否有线程、线程池和控制原语(锁、事件等)”和 2)“您是否正在开发可重用的库或普通应用程序?”
如果您的库有线程工具(几乎总是基于 PThread 的某种风格构建),请使用它们。如果您是库开发人员,请花时间(如果可能)来构建它们。这是值得的 - 您可以组合比 OpenMP 提供的更细粒度、更高级的线程。
相反,如果您时间紧迫或只是开发应用程序或第三方工具的某些内容,请使用 OpenMP。您可以将其包装在几个宏中并获得所需的基本并行性。
一般来说,OpenMP 对于基本的多线程处理来说已经足够了。一旦您开始直接管理系统资源来构建高度异步的代码,其易用性优势就会被性能和界面问题所取代。