gpt4 book ai didi

c++ - boost::asio,线程池和线程监控

转载 作者:可可西里 更新时间:2023-11-01 18:29:37 27 4
gpt4 key购买 nike

我已经使用 boost::asio 实现了一个线程池,一些 boost::thread 对象调用 boost::asio::io_service: :运行()。但是,给我的要求是有一种方法来监视所有线程的“健康”。我的目的是制作一个可以通过线程池传递的简单哨兵对象——如果它通过了,那么我们可以假设该线程仍在处理工作。

但是,根据我的实现,我不确定如何(如果)能够可靠地监视池中的所有线程。我只是将线程函数委托(delegate)给 boost::asio::io_service::run(),因此将哨兵对象发布到 io_service 实例中并不能保证哪个线程实际上会得到那个哨兵并完成工作。

一种选择可能是定期插入哨兵,并希望它在合理的时间内至少被每个线程拾取一次,但这显然并不理想。

举个例子。由于处理程序的编码方式,在这种情况下我们可以看到每个线程将完成相同数量的工作,但实际上我无法控制处理程序的实现,有些可以长时间运行,而有些则几乎立即。

#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <boost/thread.hpp>
#include <boost/bind.hpp>

void handler()
{
std::cout << boost::this_thread::get_id() << "\n";
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}

int main(int argc, char **argv)
{
boost::asio::io_service svc(3);

std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(svc));

boost::thread one(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread two(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread three(boost::bind(&boost::asio::io_service::run, &svc));

svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);

work.reset();

three.join();
two.join();
one.join();

return 0;
}

最佳答案

您可以在所有线程之间使用一个通用的 io_service 实例,并为每个线程使用一个私有(private)的 io_service 实例。每个线程都会执行这样一个方法:

void Mythread::threadLoop()
{
while(/* termination condition */)
{
commonIoService.run_one();
privateIoService.run_one();

commonConditionVariable.timed_wait(time);
}
}

这样,如果你想保证某个任务在一个线程中执行,你只需要将这个任务发布到它拥有的io_service中。

要在您的线程池中发布任务,您可以执行以下操作:

void MyThreadPool::post(Hander handler)
{
commonIoService.post(handler);
commonConditionVariable.notify_all();
}

关于c++ - boost::asio,线程池和线程监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com