좋은 질문입니다.
여기에는 몇 가지 접근 방법이 있습니다.
첫 번째 방법은 이상적인 접근 방법으로 생각합니다. 그리고 그것은 절대로 스레드를 종료하지 않는 것입니다.
- 스레드가 동기화 개체를 소유하는 경우, 그들은 공개되지 않습니다
- RAII 객체는
- 을 정리할 수있는 기회를 얻을하지 않습니다 그 이유는 일부 거물 여러하지만 여기에 있습니다 할당 된 메모리는 당신이 certian 커널 호출의 중간에있는 경우
- , 당신은
그래서 스레드가 종료되지 않은 이유, 당신은 이유를 식별하는 것이이 방법으로가는 전체 응용 프로그램 호스 수 해제되지 않습니다 그 문제를 해결하십시오. 문제가 심화 될 수 있습니다. 교착 상태, 경쟁 조건 등을 찾을 수 있습니다. 정적 분석은 이러한 문제를 찾는 데 도움이 될 수 있습니다.
이상적인 접근 방식은 항상 요구해야하는 것입니다. 그리고 이것을 할 때 스핀 락을 사용하지 않는 것이 가장 좋습니다. 대신 스레드 핸들에서 Wait()이 시간 초과됩니다. 방적함으로써 자원을 낭비하고 기다리는 스레드의 시간 조각을 훔칩니다.
그러나 실세계에서는 프로덕션 코드에서 다른 모든 것이 실패 할 경우 대비책이 필요합니다. 먼저 여러 가지 방법을 시도하여 스레드가 스스로 종료되도록해야합니다. 모든 것이 절대적인 최후의 수단으로 실패하면 스레드를 종료하십시오. 그러나 좀비 스레드를 죽이는 위험 때문에 일단이 작업을 완료하면 전체 응용 프로그램을 다시 시작해야합니다. 스레드를 종료하면 프로세스를 비 결정적 상태로 만들 수 있습니다. 그러니 다시 시작하십시오.오류 메시지를 기록하고 응용 프로그램을 종료 한 다음 다시 시작하십시오.
스레드는 직렬 포트에서 비동기 입력을 수신하는 데 사용됩니다. 그러나 스레드는 직렬 포트를 여는 데 사용되는 리소스를 소유하지 않습니다. 스레드가 소유 한 유일한 자원은 수신 된 데이터를 처리하기 위해 관리하는 순환 버퍼입니다. 스레드가 닫히면 버퍼가 더 이상 필요하지 않습니다. –