【问题标题】:prevent multi-thread application from termination when one of its thread performs an illegal operation防止多线程应用程序在其线程之一执行非法操作时终止
【发布时间】:2022-01-04 14:27:32
【问题描述】:

是否可以防止多线程应用程序在其线程之一执行非法操作(如整数除以零操作)时终止。这是一个示例代码:

#include <iostream>
#include <thread>
#include <chrono>

void thread1() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    for (int i = 3; i >= 0; --i)
        std::cout << (3 / i) << std::endl;
    std::cout << "thread end" << std::endl;
}

int main() {
    std::thread t(thread1);
    t.detach();

    std::cout << "before sleep\n";
    std::this_thread::sleep_for(std::chrono::seconds(5));
    //t.join();
    std::cout << "after sleep\n";
}

在上面的代码中,我尝试在线程中进行整数除以零操作,导致整个程序终止。

【问题讨论】:

  • 除以零(整数运算)是硬件故障。如果您使用 Microsoft 编译器,您可以将此类异常转换为 SEH 异常 - 然后它可以被 try/catch C++ 块捕获,您可以将其放入您的线程函数中以捕获此类异常。
  • @rafix07 不是 C++ try/catch 块,而是特殊的 SEH __try/__except 语句。
  • @Someprogrammerdude 你可以设置 try/catch 来捕获 SEH。但这是一个非常糟糕的设置。请参阅 docs.microsoft.com/en-us/cpp/build/reference/…a 选项。仅供读者参考,请勿在 msvc 上为 /EH 使用 a 选项。
  • 嗯,我有一个应用程序就是这样做的——在最外面的“while(true)”循环中逃脱线程之前捕获所有异常,包括 SEH。两年来,客户在应用程序日志中收到“访问冲突”文本行,没有发现任何不良影响。这并不理想,但它使应用程序保持运行。最终,我找到/修复了根本原因,错误消失了:)

标签: c++ multithreading


【解决方案1】:

不,一般来说这是不可能的;一个进程中的所有线程共享相同的内存空间,这意味着任何一个线程中的致命错误都可能破坏了进程中其他任何东西的数据结构,因此整个进程被终止。

如果你真的需要你的程序能够在致命错误中幸存下来,那么有问题的代码需要在一个单独的子进程中执行,这样当它崩溃时,父进程可以幸存(并且可能重新启动一个新的子进程,或任何合适的)。但总的来说,首选方法只是确保您的代码不包含任何会导致崩溃的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多