【问题标题】:Random error in code代码中的随机错误
【发布时间】:2014-05-06 04:45:02
【问题描述】:

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

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();
}

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

【问题讨论】:

  • (a) 错误不是随机的,尤其是如果它们重复出现 (b) 我从未见过“严重异常错误”消息在我生命中。 (c) 如果它说“严重异常错误” - 我会说 接下来的单词 非常相关...:|
  • @(a)这些错误对我来说是随机出现的。@(c):一些错误消息:如果我在我的 DLL 或调用 exe 中更改某些内容,则 RunDLL.exe 中 0x002A7D7F 出现异常错误,十六进制代码也在变化。
  • 你能说的唯一客观的事情是“它们在每次运行中都不会始终如一地出现”。感知到的随机性是非常主观的。至于“严重异常错误”:谷歌搜索表明您可能误译了德语短语“schwerer Ausnahmefehler” - 最好将其翻译为“致命异常错误”。
  • @ArneMertz:是的,我认为这是我的错误。我想我将问题缩小到线程 2,如果我调用 thread_2.join(),我没有收到错误,但我的程序永远不会完成,当我不调用这个时,我的程序有时会崩溃......

标签: c++ multithreading boost


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您似乎没有以干净的方式停止io_serviceio_serice::run 在有要调度的 ramining 处理程序时阻塞。我的猜测是您的udp_server_search 会导致处理程序无休止地排队。因此,要么您的加入永远不会完成,因为它必须等待 run() 返回而这永远不会发生,或者如果您将其注释掉,离开 get_remote_ip 将破坏 io_service 而在 thread_2run 方法继续将在现已销毁的对象上执行。

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

    boost::thread thread_2( [&]{io_service.run();} );
    //do stuff, wait for the timer etc...
    
    io_service.stop(); //run should return as soon as possible
    thread_2.join(); //clean finishing of the service.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2020-07-07
      • 2021-11-18
      • 2023-03-12
      相关资源
      最近更新 更多