인프런 커뮤니티 질문&답변

우성님의 프로필 이미지
우성

작성한 질문수

독하게 되새기는 C 프로그래밍

스레드 동기화

실습 중에 혹시 예외 발생하신 분들을 위해

해결된 질문

작성

·

252

3

Enter, Leave로 동기화 후 메인 쓰레드 루프 탈출을 위해

q를 입력했을 때 간헐적으로

아래와 같은 에러가 발생하였습니다


요거.. 선생님께 여쭤보려다가 문득 원인을 찾았습니다

혹시 저와 같은 에러를 겪으신 분들을 위해

정리를 하자면 아래와 같습니다

 

메인 쓰레드 루프 탈출 까지는 정상적으로 수행됩니다

다만, DeleteCriticalSection 함수 호출 후

return 코드를 호출하기 전 찰나의 순간에

set 또는 reset 워커 쓰레드에서

EnterCriticalSection을 호출하여 예외가 발생합니다

 

즉,

DeleteCriticalSection과 return의 코드 호출은

원자적이지 않기 때문에 두 함수가 수행되는 중간에

다른 워커 쓰레드에서

EnterCriticalSection 함수를 호출하는 경우인데요

 

이는, Delete돼서 존재하지 않는
임계영역에 Enter를 시도하기 때문입니다

 

 

답변 1

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

와우~~~! 질문과 동시에 스스로 해결도 하시고 결과까지 공유해주셨네요. :)

해당 예제는 작업자 스레드의 종료과정을 고려하지 않고 있어서 문제가 됐습니다. 모든 작업자 스레드가 종료된 후 메인 스레드가 종료되도록 수정하면 문제는 해결되겠습니다.

사소한 부분까지 꼼꼼하게 챙기시는 것을 보니...분명 좋은 시스템 개발자로 성장하실 것 같습니다.
정보 공유 고맙습니다. :)

우성님의 프로필 이미지
우성

작성한 질문수

질문하기