C ++线程池

时间:2010-10-21 13:49:33

标签: c++ multithreading boost threadpool boost-thread

在生产代码中使用的C ++线程池的开源实现是什么(类似于boost)?

请提供您自己的示例代码或示例代码使用的链接。

7 个答案:

答案 0 :(得分:21)

我认为它仍未被Boost接受,但是一个很好的注意点: threadpool。一些使用示例,来自网站:

#include "threadpool.hpp"

using namespace boost::threadpool;

// Some example tasks
void first_task()
{
  ...
}

void second_task()
{
  ...
}

void third_task()
{
  ...
}

void execute_with_threadpool()
{
  // Create a thread pool.
  pool tp(2);

  // Add some tasks to the pool.
  tp.schedule(&first_task);
  tp.schedule(&second_task);
  tp.schedule(&third_task);

  // Leave this function and wait until all tasks are finished.
}

池的参数“2”表示线程数。在这种情况下,tp的销毁会等待所有线程完成。

答案 1 :(得分:9)

您可能需要查看http://threadpool.sourceforge.net/

使用thread pool自行实施Boost.Thread并不困难。根据任务的不同,您可能希望使用lock-free容器作为队列而不是Standard Template Library中的容器。例如,来自lock free库的fifo容器。

祝你好运!

答案 2 :(得分:7)

我写了一个小例子here。基本上你需要做的是实现这段代码:

asio::io_service io_service;
boost::thread_group threads;
auto_ptr<asio::io_service::work> work(new asio::io_service::work(io_service)); 

// Spawn enough worker threads
int cores_number = boost::thread::hardware_concurrency();
for (std::size_t i = 0; i < cores_number; ++i){
    threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
}
// Post the tasks to the io_service
for(vector<string>::iterator it=tasks.begin();it!=tasks.end();it++){
   io_service.dispatch(/* YOUR operator()() here */);
}
work.reset();

答案 3 :(得分:3)

我相信你可以在boost :: asio中使用io_service模拟一个线程池。您可以控制io_service池可用的线程数,然后您可以将任务“发布”到io_service,这将由池中的一个线程执行。每个这样的任务都必须是一个仿函数(我相信)。

我现在不能在这里举一个例子,但io_service池上的asio文档将概述如何做到这一点。

答案 4 :(得分:1)

这是一个使用线程池的简单的只有头的任务队列(基于Boost构建):taskqueue.hpp

TaskQueue project page包含展示how to use it的示例应用程序:

答案 5 :(得分:0)

This library以Boost.Thread为基础。有short tutorial有一些示例代码。如果这不符合您的要求,您可以将其用作基线。

如果你选择这条路线,请确保你使用的是Boost版本&gt; = 1.37。

答案 6 :(得分:0)

ffead-cpp描述了使用here框架的示例实现。它提供直接的,基于优先级的以及预定的线程池实现。看看......