首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在遗留c++上创建自己的线程池?

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

Stack Overflow用户
提问于 2015-09-16 14:00:45
回答 1查看 348关注 0票数 0

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

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

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

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

应要求:关于问题:

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

经过大量的研究和尝试,我发现线程池是这里的解决方案,但我花了超过3天的时间让我在网上找到的实现工作起来,但没有效果,所以我决定编写自己的线程池实现。

关于您可以检查的代码示例:join. Mingw32, c++

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 14:55:02

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

首先是几个陈述。

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

现在,转到线程池。基本线程池包含三个主要部分:传入消息队列、传出消息队列和为这些队列服务的一组线程。根据设计的不同,这些消息可能是真正的消息(即表示“亲爱的线程,请计算5+10”的字符串),也可能是可调用的东西,线程只是调用它。类型擦除的函数对象在这里工作得最好。因此,当消息是文本时,线程函数将有一堆if()语句来处理不同的消息,当它是可调用的时,它只会调用这个可调用的语句。文本消息更容易维护,因为文本本身包含了您需要关注的所有内容。另一方面,可调用对象有一个生命周期,您应该考虑这一点--例如,将局部变量作为可调用对象将是一个必然的灾难。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32610790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档