Я пытаюсь создать простую структуру, которая содержит объект 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 << "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;
}
И вот тут я понимаю, что дела идут ужасно: мой ожидаемый результат будет 3 отпечатка «HelloWorld», однако я получаю только 2. Что еще более странно, что если я запусту отладку и продолжу дальнейшие инструкции по инструкции, HelloWorld напечатано только один раз!
Честно говоря, я ничего не понимаю, но мне ясно, что я не до конца понимаю, как работают многопоточность и io_services, а документация на Boost.org ВСЕ не помогает.