쓰레드 동기화에 관한 문제입니다.
메인 스레드에서 procedure A 를 호출 가능하구요..
일정 시간마다 깨어나서 수행되는 다른 스레드에서 procedure A를 호출 가능해요..
다른 스레드에서 procedure A를 호출 할 때는
synchronize 로 호출하구요..
procedure A 에는 크리티컬 섹션이 있어요..
procedure A
.
.
.
critical Section
.
.
.
이렇게 되어 있는데.. 지금은 critical section 에
메인 스레드와 다른 스레드가 같이 들어갈 수 있잖아요..
그래서 동기화 때문에 저 procedure A 가 구현 되어 있는 모듈의 생성자에
semaphore := createsemaphore(nil,1,1,'-_-'); 로 semaphore 생성하구요..
procedure A를
procedure A
.
.
.
waitforsingleobject(semaphore,infinite);
.
.
.
critical section
.
.
.
releasesemaphore(semaphore,1,nil);
로 했습니다...
또 모듈 소멸자에
closehandle(semaphore);
했습니다;
그런데 문제는
waitforsingleobject 를 한넘이 지나가고
그넘이 빠져나가기 전에
두번째 넘이
waitforsingleobject 를 들어가면
두번째넘 들어간 넘은 첫번째넘 빠져나갈때까지 대기하잖아요..
근데.. 두번째넘이 들어간 waitforsingleobject에 걸려서
프로그램이 진행 안되어서 첫번째 넘이 빠져나갈 생각을 안해요;;
왜 그럴까요?-_-;
알려주세요..~~
procedure A 는
procedure A
begin
waitforsingleobject
try
criticalsection
finally
releasesemaphore
end;
end;
구조라서 releasesemaphore 는 반드시 실행 될 구조거든요.
고수님의 답변 부탁 드리겠습니다.