2012-09-22 4 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 처리기는 exit를 호출하는 스레드에서 호출됩니다. 스레드마다 처리기를 원하면 pthread_key_create 소멸자를 사용할 수 있습니다.

0

하나의 스레드에서 atexit 핸들러를 호출해야하는 표준에는 아무런 제약이 없습니다.

실제로 등록 된 (동시에 등록되지 않은 것처럼) 동시에 등록 된 핸들러는 동시에 실행될 수 있다고 생각합니다. 그러나 표준에서는 등록이 다른 순서보다 먼저 처리되는 핸들러가 후자의 순서대로 실행된다는 것을 보증합니다.

+1

exit()를 호출 한 스레드에서 atexit 핸들러를 순차적으로 호출하는 것이 아니라 exit() 구현을 상상하기는 어렵습니다. 이 표준이 atexit 호출이 동기화되지 않은 atexit 핸들러의 순서를 정의하지는 않지만, 표준은 스레드 안전성을 요구하는 atexit을 필요로하므로 호출에 대한 순서가 있어야하는 것처럼 보입니다. 어쨌든 구현에 따라 서로 다른 스레드의 atexit 호출이 의도적으로 동기화되었는지 여부를 알 수 있습니다. – rici

관련 문제