正在结构中创建绑定到io_service的线程



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

ApplicationPair.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

这里的想法是,我创建的每个新ApplicationPair对象都将在io_service上有自己的线程,并将在实例化时启动我想要的任何方法。

主要内容如下:

main.cpp

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
#include <cstdio>
boost::asio::io_service iSvc;
void HelloWorld()
{
std::cout << "HelloWorldn";
}
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;
} 

这就是我意识到事情进展得很糟糕的地方:我预期的输出将是3张"HelloWorld"的照片,但我只得到了2张。更奇怪的是,如果我运行调试,并按指令继续执行,HelloWorld只打印一次!

老实说,我一无所知,但很明显,我还没有完全理解多线程和io_services是如何工作的,Boost.org上的文档也没有任何帮助。

正如您所怀疑的,您遗漏了有关ASIO的一些关键点。

您表示希望每个ApplicationPair在io_service上都有自己的线程。事实并非如此。在线程上调用io_service.run((后,该线程现在归io_service所有。io_service将根据自己的意愿安排事件。

把它想象成一个线程池,将任务发布到io_service,它将它们调度到池中。

此外,你应该看看线束。这就像ASIO版本的互斥锁。它的功能相似,但概念不同。boost::asio-strand示例

这在这里可能并不重要,因为您不是在读取或写入变量,但是std::cout是一个必须管理的全局资源。

我试图重新编写您的代码来给您举一个例子,但这些差异将极大地改变它。我不太确定你的最终目标是什么,所以很难提供一个例子。

此外,以下是一些不错的youtube视频:asio::strandasio基础

相关内容

最新更新