升压线程池(boost thread pool)

2019-09-24 02:28发布

我需要一个线程池为我的申请,我想依赖于标准(C ++ 11或升压)的东西尽可能多地。 我知道有一个非官方的提升线程池类,它基本解决了我所需要的,但我宁愿避免它,因为它不是在升压库本身(!) - 为什么它仍然不是核心库经过这么很多年?

在这个页面和其他地方的一些帖子,人们使用boost :: ASIO实现像行为线程池建议。 乍一看,看起来像什么,我想做的事,但是我发现,我所看到的所有的实现都没有办法参加当前活动的任务,这使得它没用了我的申请。 要执行加入,他们发出停止信号给所有线程,并随后加入他们的行列。 然而,完全勾销在我的使用情况下的线程池的优势,因为这使得新的任务,需要一个新的线程的创建。

我想要做的是:

ThreadPool pool(4);
for (...)
{
    for (int i=0;i<something;i++)
        pool.pushTask(...);
    pool.join();
    // do something with the results
}

任何人都可以提出一个解决方案(除了使用SourceForge上的现有非官方的线程池)? 有没有在C ++ 11或核心升压任何可以帮助我在这里?

Answer 1:

乍一看,看起来像什么,我想做的事,但是我发现,我所看到的所有的实现都没有办法参加当前活动的任务,这使得它没用了我的申请。 要执行加入,他们发出停止信号给所有线程,并随后加入他们的行列。 然而,完全勾销在我的使用情况下的线程池的优势,因为这使得新的任务,需要一个新的线程的创建。

我想你可能误会了ASIO例如:

IIRC(它已经有一段时间),每个线程的线程池运行呼吁io_service::run ,这意味着有效的每个线程都有一个事件循环和调度。 为了再拿到ASIO完成任务后你任务给io_service使用。该io_service :: post方法和ASIO的调度机制负责剩下的照顾。 只要你不叫io_service::stop ,线程池将继续作为你开始运行(假设每个线程有工作要做,或已被分配使用尽可能多线程运行io_service::work对象)。

所以你并不需要创建新任务新主题,那将违背一个线程池的概念。



Answer 2:

有每个任务类从具有一个“OnCompletion(任务)”方法/事件任务派生。 然后,线程池线程可以调用,调用任务的主run()方法之后。

等待一个任务完成便易。 该OnCompletion()可以执行任何需要的信号始发线,信号一condvar,排队任务的生产者 - 消费者队列,调用SendMessage / PostMessage的API的,调用/ BeginInvoke的,等等。

如果oringinating线程需要等待几个任务来完成所有的,你可以扩展上面,并发出一个“等待任务”到池中。 等待任务都有自己的OnCompletion沟通的其他任务的完成,有一个线程安全的“任务计数器”,(原子OPS或锁),设置为将发行的主要“任务的数量。 等待任务发布到池中第一和运行等待在等待任务的私人“allDone” condvar线程。 “主”任务,然后发给他们OnCompletion设置为调用递减到零任务柜台等待任务的方法池。 当任务计数器达到零,即实现了这一信号的allDone condvar线程。 等待任务OnCompletion然后运行等信号的所有主要任务的完成。

这样的mechansism不需要不断创建/终止/加盟/线程池线程删除,地方上发起任务需要如何信号,当你愿意,你可以发出尽可能多的具体任务组没有任何限制。 您应注意,但是,每个等待任务块一个线程池线程,所以一定要在池中创建一些额外的线程(通常不是什么问题)。



Answer 3:

这似乎是一个工作的boost ::期货 。 在文档中的例子似乎表明你希望做什么。



Answer 4:

加入一个线程的意思是停止,直到它停止,如果它停止,你想一个新的任务分配给它,你必须创建一个新的线程。 所以你的情况,你应该等待条件(例如boost::condition_variable )来表示任务的结束。 因此,使用这种技术是很容易用它来实现boost::asioboost::condition_variable 。 每个线程调用boost::asio::io_service::run和任务将被预定并在不同的线程,并在年底执行,每个任务都会设定boost::condition_variable或事件递减std::atomic ,表示结束工作! 那真的很容易,不是吗?



文章来源: boost thread pool