如何在遗留c++上创建自己的线程池?

How can I create my own thread pool on legacy c++?

本文关键字:自己的 创建 线程 c++      更新时间:2023-10-16

我正面临一个问题,因为pthread_create的高开销。我在网上找了一个好的线程池库,但是我没有找到一个适合我的项目,或者它们根本不起作用。

我对c++很陌生,我的编程技能很基础,但很好。我编程了很多(超过5年),我只是没有做过任何面向对象的项目,甚至没有使用过数据结构。

我将非常感谢任何材料或指南,可以帮助我获得创建我自己的线程池所需的经验和知识。

由于我当前项目的限制,我将在windows 10 (mingw32)上使用正常的c++(不是c++ 11),我必须避免使用任何boost库。

关于问题:

我正在写一个计算成本很高的项目。我想让它运行得更快,所以我决定使用pthreads。然而,问题是线程创建是在一个循环中,并且pthread_create被调用64次。

经过大量的研究和尝试,我发现线程池是这里的解决方案,但我花了3天多的时间让我在网上找到的实现工作,但无济于事,所以我决定写我自己的线程池实现。

关于代码的一个例子,你可以检查:我如何可以减少pthread_join的影响。Mingw32 c++、

但是在那里我意识到是线程创建,而不是thread_join导致性能变差。

尽管有一些注释,但基本线程池并没有那么复杂。它们比好的日志程序更简单,例如:)

首先是几个语句。

    pthread_create是非常轻量级的。它不太可能是一个真正的瓶颈。如果您的计算时间与创建线程所需的时间相当,那么您可能一开始就不需要线程。
  • c++ 11是标准的c++。c++ 03被称为ARCHAIC。我强烈建议您重新考虑项目的"约束"(因为您似乎没有使用外部库,ABI不兼容对您来说应该不是问题),并放弃11年的过时和不充分的编译器。

现在,来看看线程池。基本线程池包含3个主要部分:传入消息队列、传出消息队列和为这些队列服务的一堆线程。根据设计,这些消息可能是一个真实的消息(即字符串说"亲爱的线程,请计算5 + 10"),或者它可以是一个可调用的东西,线程只是调用。类型擦除的函数对象在这里工作得最好。所以,当消息是文本时,线程函数会有一堆if()语句来处理不同的消息,当它是可调用的,它会简单地调用这个可调用的。短信更容易维护,因为你需要关心的一切都在短信本身。可调用对象,另一方面,有一个生命周期,你应该考虑——例如,把局部变量作为可调用的将是一个保证的灾难。

另一部分是消息队列本身。首先,有两种可行的设计选择——每个线程都有自己的队列,或者有一个供所有线程使用的共享队列。第一种方法的好处是队列上没有争用——只有一个读队列和一个写队列。共享队列存在争用,但好处是它提供了自然的负载平衡——线程将在准备处理新消息时简单地拾取消息。

无锁队列通常是作为消息队列的一个很好的选择。