【发布时间】: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/catchC++ 块捕获,您可以将其放入您的线程函数中以捕获此类异常。 -
@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