C++ 在结构内创建绑定到io_服务的线程
我正在尝试创建一个包含boost::thread对象的简单结构。此结构(ApplicationPair)的构造函数需要传递io_服务引用对象和方法;现在,为了简单起见,我使用了一个没有参数的void方法。 之后,使用boost::bind创建线程 应用程序对.hC++ 在结构内创建绑定到io_服务的线程,c++,multithreading,boost,asio,C++,Multithreading,Boost,Asio,我正在尝试创建一个包含boost::thread对象的简单结构。此结构(ApplicationPair)的构造函数需要传递io_服务引用对象和方法;现在,为了简单起见,我使用了一个没有参数的void方法。 之后,使用boost::bind创建线程 应用程序对.h #ifndef APPLICATIONPAIR_H #define APPLICATIONPAIR_H #include <boost/thread.hpp> #include <boost/asio.hpp>
#ifndef APPLICATIONPAIR_H
#define APPLICATIONPAIR_H
#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <cstdarg>
template<typename T>
struct ApplicationPair
{
ApplicationPair(boost::asio::io_service& iSvc, boost::function<T()> func ) : _func(func)
{
iSvc.post(boost::bind(&ApplicationPair<T>::run, this));
thr = boost::thread(boost::bind(&boost::asio::io_service::run, &iSvc));
}
ApplicationPair() = delete;
~ApplicationPair() { if (thr.joinable()) thr.join(); }
void run();
boost::thread thr;
boost::function<T()> _func;
};
#endif
\ifndef应用程序对
#定义应用程序对
#包括
#包括
#包括
#包括
#包括
模板
结构应用程序对
{
应用程序对(boost::asio::io_服务&iSvc,boost::function func):\u func(func)
{
post(boost::bind(&ApplicationPair::run,this));
thr=boost::thread(boost::bind(&boost::asio::io_service::run,&iSvc));
}
ApplicationPair()=删除;
~ApplicationPair(){if(thr.joinable())thr.join();}
无效运行();
boost::线程thr;
boost::函数_func;
};
#恩迪夫
这里的想法是,我创建的每个新ApplicationPair对象在io_服务上都有自己的线程,并在实例化时启动我想要的任何方法
主要内容如下:
main.cpp
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
#include <cstdio>
boost::asio::io_service iSvc;
void HelloWorld()
{
std::cout << "HelloWorld\n";
}
template<typename T>
void ApplicationPair<T>::run()
{
this->_func();
}
int main()
{
ApplicationPair<void> p1(boost::ref(iSvc), HelloWorld);
ApplicationPair<void> p2(boost::ref(iSvc), HelloWorld);
ApplicationPair<void> p3(boost::ref(iSvc), HelloWorld);
return 0;
}
#包括
#包括
#包括
boost::asio::io_服务iSvc;
void HelloWorld()
{
std::cout_func();
}
int main()
{
应用程序对p1(boost::ref(iSvc),HelloWorld);
应用程序对p2(boost::ref(iSvc),HelloWorld);
应用程序对p3(boost::ref(iSvc),HelloWorld);
返回0;
}
这就是我意识到事情发展得很糟糕的地方:我的预期输出是3张“HelloWorld”照片,但我只得到2张。
更奇怪的是,如果我运行调试,并继续执行进一步的指令,HelloWorld只打印一次
老实说,我并不清楚,但我很清楚,我不完全了解多线程和io_服务是如何工作的,Boost.org上的文档也没有任何帮助。正如您怀疑的那样,您遗漏了有关ASIO的一些关键点 您声明希望每个应用程序对在io_服务上都有自己的线程。事实并非如此。在线程上调用io_服务.run()后,该线程现在由io_服务拥有。io_服务将根据需要安排活动 把它想象成一个线程池,您将任务发布到io_服务,它将任务调度到线程池中 此外,您还应该查看绞线。这类似于互斥体的ASIO版本。它的功能类似,但概念不同 这在这里似乎并不重要,因为您没有读取或写入变量,但是std::cout是一个必须管理的全局资源 我试图重新编写您的代码以给您一个示例,但这些差异将极大地改变它。我不确定你的最终目标是什么,所以很难举个例子 还有一些很好的youtube视频: