gpt4 book ai didi

C++,set_terminate 是每个线程的本地吗?

转载 作者:可可西里 更新时间:2023-11-01 15:06:54 26 4
gpt4 key购买 nike

set_terminate/get_terminate 是否应该为 C++ 2011 或 C++ 2003 中的多个线程设置不同的终止异常处理器?

例如如果我有程序并将终止处理程序设置为 func_1;然后我启动 3 个线程。什么是新线程中的终止处理程序?如果在每个线程中,我将在第一个线程中将终止处理程序设置为 func_2,在第二个线程中将终止处理程序设置为 func_3 等等。

N3242 (C++ 2011 草案)在 [handler.functions][support.exception]/[exception.terminate] 中只字未提/p>

PS:您可以回答 C++2011 或 C++2003 或这些标准的任何流行实现

PPS:有 FCD 评论... C++ FCD Comment Status Rev. 5 N3249 (2011) :

GB 71    18.6.2.4 / 18.8.2.2 / 18.8.3.2   

The thread safety of std::set_new_handler(), std::set_unexpected(), std::set_terminate(), is unspecified making the the functions impossible to use in a thread safe manner.

The thread safety guarantees for the functions must be specified and new interfaces should be provided to make it possible to query and install handlers in a thread safe way.

LWG 1365 ACCEPTED with MODIFICATIONS

See paper N3189

最佳答案

17.6.4.7p4 说:

Calling the set_* and get_* functions shall not incur a data race. A call to any of the set_* functions shall synchronize with subsequent calls to the same set_* function and to the corresponding get_* function.

这强烈暗示 set_*get_* 函数在相同的全局状态下运行,即使从不同的线程调用也是如此。 18.8.3 下的所有段落都讨论了“当前处理程序函数”,没有提到线程;这表明处理函数是整个程序的一个属性;同样,17.6.4.7 有:

2 - A C++ program may install different handler functions during execution [...]
3 - A C++ program can get a pointer to the current handler function by calling the following functions [...]

这些段落讨论了程序上下文中的当前处理函数,表明它是程序作用域而不是线程局部的。

关于C++,set_terminate 是每个线程的本地吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com