如何在旧版c ++上创建自己的线程池?

时间:2015-09-16 14:00:45

标签: c++ multithreading pthreads mingw threadpool

由于pthread_create的开销很高,我遇到了问题。我已经在互联网上寻找一个好的线程库,但是我没有找到适合我项目的那个,或者他们根本没有工作。

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

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

由于我当前项目的限制,我将在Windows 10(mingw32)上使用普通的c ++(而不是C ++ 11),我必须避免使用任何增强库。

按要求:关于问题:

我正在编写一个计算昂贵的项目。我想让它运行得更快,所以我决定使用pthreads。然而,问题是线程创建在循环内部,而pthread_create被调用64次。

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

关于您可以检查的代码示例:How can I reduce the effect of pthread_join. Mingw32, c++

但是我意识到它的线程创建,而不是thread_join会导致性能恶化。

1 个答案:

答案 0 :(得分:3)

在那里发表一些评论,基本的线程池并不复杂。它们比良好的记录器更简单,例如:)

首先,几个陈述。

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

现在,来线程池。基本线程池包含3个主要部分:传入消息队列,传出消息队列和为这些队列服务的一堆线程。根据设计,这些消息可能是一个真实的消息(即字符串说“亲爱的线程,请计算5 + 10”),或者它可以是一个可调用的东西,线程只是调用。类型擦除的函数对象在这里效果最好。因此,当消息是文本时,线程函数将有一堆if()语句来处理不同的消息,当它是可调用的时,它将简单地调用这个可调用的。文本消息更易于维护,因为您拥有文本本身需要关注的所有内容。另一方面,可调用对象具有生命周期,您应该将其视为 - 例如,将局部变量作为可调用对象将是一种有保障的灾难。

另一部分是消息队列本身。首先,有两种可行的设计选择 - 每个线程都有自己的队列,或者有一个共享队列供所有线程使用。第一个好处是队列中没有争用 - 有一个读者和一个作者。共享队列存在争用,但好处是它提供了自然的负载平衡 - 线程只会在准备好处理新消息时接收消息。

无锁队列通常是用作消息队列的不错选择。