在生产代码中使用的C ++线程池的开源实现是什么(类似于boost)?
请提供您自己的示例代码或示例代码使用的链接。
答案 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)