我目前正在测试 pthreads 的使用情况,以加速我拥有的其他代码。基本上我的代码目前拥有的是几个最终进行矩阵计算的 for 循环。我尝试生成将同时进行这些计算的线程,最终将运行时间缩短了一半。
我的问题是,有没有办法最初产生这些 pthread,让它们运行函数,然后再次使用它们来运行相同的函数而不关闭它们?或者执行任务后是否需要关闭它们?
顺便说一句,我正在使用 Windows,使用 pthreads 库。
我目前正在测试 pthreads 的使用情况,以加速我拥有的其他代码。基本上我的代码目前拥有的是几个最终进行矩阵计算的 for 循环。我尝试生成将同时进行这些计算的线程,最终将运行时间缩短了一半。
我的问题是,有没有办法最初产生这些 pthread,让它们运行函数,然后再次使用它们来运行相同的函数而不关闭它们?或者执行任务后是否需要关闭它们?
顺便说一句,我正在使用 Windows,使用 pthreads 库。
您可以创建一个queue
任务,您的线程将对新任务进行采样并在有任何任务时出列(最好是一些取消标志来优雅地停止它们)。
您需要通过例如使用pthread_mutex
.
您还可以使用条件变量 ( pthread_cond_t
) 来指示何时有更多任务需要执行
这样,您可以在开始时生成任意数量的线程,并在需要时添加任务。
作为旁注,您可能应该更喜欢thread
标准库的不那么繁琐。
为什么不使用成熟的并行处理库或语言扩展,如openmp、cilk、tbb。所有这些现在都非常便携,得到了主要操作系统和编译器的支持。微软也有ppl,它是 TBB 的孪生兄弟。
因此,您不必发明轮子,而是让库来处理线程和负载平衡;并防止您陷入这样的陷阱:为什么 OpenMP 的性能优于线程?
例如,任务向量可以在默认情况下并行运行,线程数就像(在 cilk 中)一样简单:
cilk_for(int i = 0; i < tasks.size(); i++)
task[i].some_function();
如果需要,您还可以更改线程数。