C++子线程抛出异常
C++ Subthreads throw exceptions
假设线程是从main方法启动的。如果在线程中抛出异常但未在线程内处理,会发生什么情况?主线会中断吗?
如果在线程中抛出异常但未在线程内处理,会发生什么?
当在std::thread
中执行的函数中未捕捉到异常时,将调用std::terminate
,默认情况下会调用std::abort
。这将导致整个过程终止,除非处理了SIGABRT
信号(通过使用std::signal
注册处理程序(。一个最小的例子:
void foo() {
throw 0;
}
int main() {
{
std::thread t(foo);
std::cout << 1 << std::endl;
}
std::cout << 2 << std::endl;
}
1
可能会被打印出来,这取决于它在进程终止之前是否可以继续。2
将不会打印,因为该过程将在到达之前终止。
请注意,虽然只能在抛出异常的线程中捕获异常,但也可以这样做,复制(或移动(异常,然后在可以再次捕获副本的主线程中重新抛出。该方法通过例如CCD_ 8来实现。从std:::async
抛出将被标准库捕获,并在访问或销毁返回的std::future
时再次抛出。
如果您使用std::thread
以外的某些线程API,例如您的平台本机的线程,请参阅该API的文档。
子线程独立于主线程运行,有多种方式可以从主线程与子线程通信。但如果子线程死了,如果子线程中有任何异常,则不会对主线程产生任何影响,子线程中的异常也无法在主线程中处理。但是,如果子线程生成了一些报告,而主线程需要这些报告来进行一些操作,那么它将影响主线程中的业务操作。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- getaddrinfo 抛出异常
- Do std容器总是在多线程环境中抛出异常