【问题标题】:C++ Can a pthread (Windows) be kept open to run a function multiple times?C ++可以保持打开pthread(Windows)以多次运行函数吗?
【发布时间】:2014-08-26 15:49:05
【问题描述】:

我目前正在测试 pthreads 的使用情况,以加快我拥有的其他代码的速度。基本上我的代码目前拥有的是几个最终进行矩阵计算的 for 循环。我尝试生成将同时执行这些计算的线程,结果将运行时间缩短了一半。

我的问题是,有没有办法最初产生这些 pthread,让它们运行函数,然后再次使用它们来运行相同的函数而不关闭它们?还是需要在执行完任务后关闭它们?

顺便说一句,我使用的是 Windows,使用的是 pthreads 库。

【问题讨论】:

  • 将指向队列的指针传递给线程。让线程检查队列是否为空。如果不是,则运行队列中的下一个函数。如果它是空的,可能会在循环中产生/睡眠。当队列中有新函数时,您可能只是“通知”线程。队列必须比线程的寿命更长。也许“静态”或“原子”队列会起作用。如果多个线程可以访问队列,您可能需要同步。
  • 只是为了从长远来看为您省去很多痛苦,C++ 标准库包含一个比 pthreads 更好(也更安全)的线程库,并且它不需要您链接到第三个-党图书馆

标签: c++ windows multithreading pthreads pthreads-win32


【解决方案1】:

您可以创建一个queue 的任务,您的线程将对新任务进行采样并在有任何任务时出列(最好是一些取消标志以优雅地停止它们)。

您需要通过例如使用pthread_mutex 来使添加任务成为线程安全的。

您还可以使用条件变量 (pthread_cond_t) 来指示何时有更多任务需要完成

这样,您可以在开始时生成任意数量的线程,并在需要时添加任务。


作为旁注,您可能应该更喜欢标准库中不那么繁琐的threading。

【讨论】:

  • 对不起,我对多线程有点陌生,请您详细说明一下吗?
  • @GBoggs 您可以使用this 教程,该教程可以并且有一些示例(例如使用互斥锁的线程点积)
  • 单个共享工作队列成为跨多个或多个线程分配大量不太大的任务的瓶颈。另一方面,如果任务大到足以隐藏开销和队列争用,则可能导致次优负载平衡和未充分利用的处理资源。请参阅我的答案以获得更好的解决方案。
  • @Anton 我很清楚这些库的存在,但考虑到 OP 专门询问“...... pthread (Windows) 是否保持打开以多次运行函数?”而不是“什么是最好的并行处理库?”我认为您的回答虽然使用了明显优越的技术,但并没有解决 OP 的原始问题。另外,OP 声明他“对多线程一般来说有点新”,所以了解基本的线程概念可能是个好主意。
  • 同意基本原则。但是考虑到并行运行的“有点新”和“for 循环”,我怀疑 OP 是否真的想要直接使用线程——这就像使用汇编程序进行文本处理一样。
【解决方案2】:

为什么不使用成熟的并行处理库或语言扩展,例如 。所有这些现在都非常便携,得到了主要操作系统和编译器的支持。微软还有,这是 TBB 的孪生兄弟。

因此,您不必发明轮子,而是让库来处理线程和负载平衡;并防止你陷入这样的陷阱:Why is OpenMP outperforming threads?

例如,任务向量可以在默认情况下并行运行线程数就像(在cilk中)一样简单:

cilk_for(int i = 0; i < tasks.size(); i++)
    task[i].some_function();

如果需要,您还可以更改线程数。

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多