代码中的随机错误

时间:2014-03-27 09:47:14

标签: c++ multithreading boost

我有一个功能,必须搜索网络中的所有电脑并寻找响应:

DLL void get_remote_ip(void)
{
    initWSA();
    if(create_Sockets() == INVALID_SOCKET)
    {
        std::cerr << "Socket Error\n";
        return;
    };
    initiate_TXRX_variables();
    boost::asio::io_service io_service;
    udp_server_search server(io_service);
    std::cout << "No crash till here\n";
    boost::thread thread_1 = boost::thread(ultra_spam_network_udp);
    boost::asio::deadline_timer dt1 = boost::asio::deadline_timer(io_service);
    boost::thread thread_2(boost::bind(&boost::asio::io_service::run, &io_service));
    dt1.expires_from_now(boost::posix_time::milliseconds(2000));
    dt1.wait();
    //ip_adr_ccd = server.return_ip(0);
    if(ip_adr_ccd != "localhost" && ip_adr_daisy != "localhost")
    {
        std::cout << "Remote IP of CCD is: " << ip_adr_ccd << '\n';//For debug
        std::cout << "Remote IP of TERS is: " << ip_adr_daisy << '\n'; //For debug
    }
    else
        std::cout << "No new remote ips found\n";
    //std::cout << Use << '\n';
    //thread_1.join();
}

当我调用此函数时,我的程序有时会在没有告诉我原因的情况下崩溃,它只是告诉我“&lt; hex-address&gt;中的异常错误”。我的虫子在哪里?是否有可能一个线程尝试加入,但另一个线程现在还没有完成(这可能是因为错误非常随机并且在写入时杀死主线程的std :: cout-output)?
谢谢!

2 个答案:

答案 0 :(得分:3)

我发现了我的错误,我必须先停止io_service然后再调用thread_2.join(),否则我的thread_2会崩溃。

答案 1 :(得分:3)

你似乎没有以干净的方式阻止io_serviceio_serice::run阻止,同时派遣ramining处理程序。我的猜测是你的udp_server_search导致处理程序无休止排队。因此,要么您的加入永远不会完成,因为它必须等待run()返回从未发生过的事情,或者如果您将其评论出来,则get_remote_ip会在{{1}时删除io_service继续在现在销毁的对象上执行thread_2方法。

什么可以解决你的问题(除了打破服务器上无休止的队列)是手动停止ioservice:

run