2012-09-22 43 views
2

我对使用atexit在多线程应用程序中存在疑问。不同线程中的多个atexit处理程序

假设我有以下情形

Thread A calls atexit(handler_a) 
Thread B calls atexit(handler_b) 
main() calls atexit(handler_main) 
Thread C calls atexit(handler_c) 
.... 

都处理函数在一个独特的线程执行,或者是他们在单独的线程中执行?

如果他们在单个线程(一个接一个地执行)中执行,该线程将成为主线程吗?

我正在使用Linux和g ++。

回答

5

正如rici所说,atexit处理程序是从调用退出的线程调用的。如果你想要每个线程处理程序,你可以使用pthread_key_create析构函数。

0

我没有看到任何约束条件,需要从一个线程调用atexit处理程序。实际上,我认为同时注册的处理程序(如同时在其他注册中排序)也可以同时执行。然而,该标准确保注册在另一个之前排序的处理程序将在后者之后执行。

+1

很难想象在调用exit()的线程中,不仅仅调用atexit处理程序的exit()的实现。确实,该标准没有定义atexit处理程序的顺序,对atexit的调用没有同步,但标准确实需要atexit是线程安全的,所以看起来必须有一些调用顺序。无论如何,很难看到实现如何知道两个来自不同线程的调用是否被故意同步。 – rici