如何在遗留c++上创建自己的线程池?
How can I create my own thread pool on legacy c++?
我正面临一个问题,因为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()语句来处理不同的消息,当它是可调用的,它会简单地调用这个可调用的。短信更容易维护,因为你需要关心的一切都在短信本身。可调用对象,另一方面,有一个生命周期,你应该考虑——例如,把局部变量作为可调用的将是一个保证的灾难。
另一部分是消息队列本身。首先,有两种可行的设计选择——每个线程都有自己的队列,或者有一个供所有线程使用的共享队列。第一种方法的好处是队列上没有争用——只有一个读队列和一个写队列。共享队列存在争用,但好处是它提供了自然的负载平衡——线程将在准备处理新消息时简单地拾取消息。
无锁队列通常是作为消息队列的一个很好的选择。
- 您应该在什么时候创建自己的异常类型
- 如何在C++中创建自己的循环版本?
- 如何在C++中创建自己的编译密钥
- 我正在尝试在视觉工作室上创建自己的库/源函数
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- C++ 在其自己的类中创建对象的修改副本
- 如何为C++映射创建自己的字符串比较对象
- (如何)在提升几何中创建自己的多边形类型并与之一起使用multi_polygon类型?
- 为什么要创建自己的自定义异常类
- 使用 const char * 与 char * 创建自己的字符串
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- 创建自己的线性过滤器
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 我创建了自己的智能指针类,我用这个智能指针指向一个类实例,如何正确返回智能指针
- 在 C++ 中创建自己的错误处理机制
- 如何使用新字符串而不是分配器创建自己的字符串类型向量?
- 在C++中创建自己的运算符**?
- Windows:创建自己的杀死程序
- 创建自己的异常(2种方法)C
- 是否可以创建自己的QT注释