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

标签 c++ multithreading pthreads mingw threadpool

由于 pthread_create 的高开销,我遇到了一个问题。我在互联网上寻找一个好的线程池库,但没有找到适合我的项目的库,或者它们根本不起作用。

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

如果有任何 Material 或指南可以帮助我获得创建自己的线程池所需的经验和知识,我将不胜感激。

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

按要求:关于问题:

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

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

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

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

最佳答案

尽管那里有一些评论,但基本的线程池并没有那么复杂。它们比好的记录器更简单,例如 :)

首先,有几点声明。

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

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

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

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

关于c++ - 如何在旧版 C++ 上创建自己的线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610790/

相关文章:

c++ - 如何在 C++ 中对类使用运算符重载函数?

c++ - 编译文件的 Netbeans 错误

c# - 如果内部发生异常,锁定的对象是否会保持锁定状态?

c - 通过 pthread_join() 加入两个 pthread 无法按预期工作

c - 将整数类型转换为指向c中整数的指针

c - 使用 pthread_join 时出现段错误(退出代码 139)

c++ - 如何链接到从源代码而不是系统库构建的 libusb?

c++ - 有没有办法引用当前对象的类

c# - 使用信号量而不是 while 循环。这是好事还是坏事?

ios - 是否使用GCD?