> 백엔드 개발 > C++ > C에서 `main()` 함수가 종료되면 분리된 스레드에 어떤 일이 발생합니까?

C에서 `main()` 함수가 종료되면 분리된 스레드에 어떤 일이 발생합니까?

Patricia Arquette
풀어 주다: 2024-12-31 04:37:07
원래의
333명이 탐색했습니다.

What Happens to Detached Threads When the `main()` Function Exits in C  ?

분리된 스레드가 Main()보다 오래 지속되면 어떻게 되나요?

C에서는 detach()를 사용하여 스레드를 분리하여 실행할 수 있습니다. 처음에 생성한 std::thread 객체와는 독립적입니다. 그러나 main()이 종료될 때 분리된 스레드에 대한 표준 동작은 여전히 ​​모호합니다.

표준 침묵 및 묵시적 효과

C 14 초안의 섹션 1.10이나 30.3 모두 명시적으로 언급되지 않았습니다. main()이 종료될 때 분리된 스레드의 운명을 정의합니다. 이러한 모호함은 다음과 같은 몇 가지 질문으로 이어집니다.

  • 스레드를 분리하면 정의되지 않은 detach() 동작이 사용됩니까?
  • 그렇다면 main()이 부족할 때 정의된 효과가 있습니까? 분리된 스레드가 아직 실행 중인가요?

명시적인 지침이 없으면 분리된 스레드에서 main()이 부족함을 의미합니다. 분리된 스레드를 중지하면 본질적으로 detach()가 무의미해지기 때문에 스레드에는 정의된 효과가 있어야 합니다.

묵시적 제한

표준에서는 분리된 스레드에 어떤 일이 발생하는지 명시적으로 명시하지 않습니다. 스레드의 경우 몇 가지 제약 조건을 제공합니다.

  • 분리된 스레드는 액세스할 수 없습니다(자동 또는 thread-local) main()이 종료될 때 다른 스레드 또는 정적 개체의 변수.
  • 스레드는 정적 개체 소멸 후 신호 처리기의 제한 사항을 준수해야 하며, 이는 원자를 제외한 대부분의 C 표준 라이브러리를 제외합니다.

분리된 스레드에 합류

분리 여부에 대한 질문 스레드를 조인할 수 있다는 문제도 답변에서 해결되었습니다. 대답은 분리된 스레드가 실제로 *_at_thread_exit 함수 계열(notify_all_at_thread_exit(), std::promise::set_value_at_thread_exit() 등)을 사용하여 조인될 수 있음을 보여줍니다.

정의되지 않은 동작 완화

피하려면 분리된 스레드가 실행 중인 상태에서 main()이 종료될 때 정의되지 않은 동작을 고려하십시오.

  • 완료 신호를 보내는 _at_thread_exit 함수를 사용하여 분리된 스레드를 수동으로 조인하세요.
  • 분리된 스레드가 실행만 실행되는지 확인하세요. 정적 객체 이후의 신호 처리기에 안전한 코드 destroy.

결론

C 표준은 main()이 종료될 때 분리된 스레드의 동작을 명시적으로 정의하지 않지만 다음과 같은 제한 사항과 의미를 제공합니다. 정의된 효과. 이러한 제한 사항을 준수하고 *_at_thread_exit 함수 계열을 사용함으로써 프로그래머는 분리된 스레드를 처리하고 정의되지 않은 동작을 방지할 수 있습니다.

위 내용은 C에서 `main()` 함수가 종료되면 분리된 스레드에 어떤 일이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿