Q&A

  • 스레드 동기화 문제입니다. 세마포어 사용하는데 해결이 안되네요..
쓰레드 동기화에 관한 문제입니다.

메인 스레드에서 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 는 반드시 실행 될 구조거든요.

고수님의 답변 부탁 드리겠습니다.
0  COMMENTS