C++ 在结构内创建绑定到io_服务的线程

C++ 在结构内创建绑定到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>

我正在尝试创建一个包含boost::thread对象的简单结构。此结构(ApplicationPair)的构造函数需要传递io_服务引用对象和方法;现在,为了简单起见,我使用了一个没有参数的void方法。 之后,使用boost::bind创建线程

应用程序对.h

#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视频: