c++ - boost asio 行为 - 从多个线程调用 ios_service::run

标签 c++ multithreading boost boost-asio

我正在尝试使用 boost::asio 截止时间计时器来延迟函数调用,如下所示

#include <boost/asio.hpp>
#include "boost/thread.hpp"
#include <iostream>

class MyTest {
public:
    MyTest()
    :_invokeCount(0),
     _handleCount(0)
    {}

    void handler(int i)
    {
        std::cout<<"\t\tHandled " <<i << std::endl;
        ++_handleCount;
    }
    void RunIOService()
    {
        std::cout<<"\tStarted :"<< _invokeCount<< std::endl;
        _ios.run();
        std::cout<<"\tFinished "<< _invokeCount << std::endl;
    }
    void invokeTimer()
    {
        std::cout<<"invoked " << ++_invokeCount << std::endl;

        boost::asio::deadline_timer t(_ios, boost::posix_time::milliseconds(5));
        t.async_wait(boost::bind(&MyTest::handler, this, _invokeCount));
        boost::thread th = boost::thread(boost::bind(&MyTest::RunIOService, this));
    }
    void PrintCount()
    {
        std::cout<<"Count = "<< _invokeCount << std::endl;
    }
    void Wait()
    {
        while (_invokeCount > _handleCount) {
            std::cout<<"X ";
            Sleep(1000);
        }
    }

private:
    int _invokeCount;
    int _handleCount;
    boost::asio::io_service _ios;
};

int main(int argc, char* argv[])
{
    MyTest test;
    for (int k=0; k<5; ++k) {
        test.invokeTimer();
        Sleep(40);
    }
    test.Wait();
    test.PrintCount();

    return EXIT_SUCCESS;
}

此应用程序的输出与我预期的不同:-

invoked 1
    Started :1
        Handled 1
    Finished 1
invoked 2
    Started :2
    Finished 2
invoked 3
    Started :3
        Handled 2
    Finished 3
invoked 4
    Started :4
        Handled 3
    Finished 4
invoked 5
    Started :5
        Handled 4
    Finished 5
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

我希望在 ios_service::run 返回之前调用每个处理程序,但从输出来看似乎并非如此(Started:2 和 Finished:2 之间缺少输出)。此外,应用程序永远不会退出。即永远不会调用第 5 个处理程序。

我错过了什么?

谢谢!

最佳答案

一些事情:

  1. 您可能不需要 5 个线程。为什么不创建一个线程并将事件触发到线程中运行的单个 ioservice 实例
  2. 尝试在线程运行函数中使用 io_service::work,以便在处理所有请求时将 io_service 保持在范围内。
  3. 当你等待完成时,停止你的io_service,加入你的线程并让你的程序退出
  4. 在这里阅读关于 io_service::work 的信息:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service.html

关于c++ - boost asio 行为 - 从多个线程调用 ios_service::run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24846117/

相关文章:

c++ - 安全终止 Meyers Singleton 中的线程

c++ - 访问 QList 中的派生类时的最佳实践

c++ - 'int' 之前的预期主表达式

c++ - 随机访问优先级队列

java - 垃圾收集器是守护线程吗?

iphone - 控制音频的声音

c++ - boost::serialization - 是否有一种可移植的方式来二进制序列化 std::wstrings?

c++ - 头文件的解释

c# - 哪些结构使用 .NET 4 中的 ThreadPool?

c++ - 如何将 C++ boost posix_time::ptime 的分辨率更改为毫秒?