2014-07-07 4 views
1

함수 호출에서 자원을 획득 (잠금)하려는 경우가 있지만 콜백 (다른 스레드)에서 프로세스의 종료를 알리는 경우가 있습니다. (리소스가 외부입니다. 기본적으로 특정 버스는 시작할 때 사용 중이며 콜백으로 다시 사용 가능합니다.)한 스레드에서 잠그고 다른 스레드에서 해제 할 동기화 객체

잠금/임계 섹션에서는 이것이 불가능합니다. Mutex도 시도했지만, 다른 스레드에서 릴리스했기 때문에 예외 만 발생했을 수 있습니다.

여기에있는 옵션은 무엇입니까?

내가

  1. ()가 잠시 (수행 한 후 휘발성 부울에 대한 액세스를 고정하고, WaitOne 대신 잠) "수동으로"동기화 그들이하는 부울을 만들 하나에
  2. 사용 이벤트를 할 수있는 것 동기화 객체를 관리하는 세 번째 래퍼 스레드에서 모든 것을 스레딩하십시오.

간단히하기 위해 나는 아마도 bool로 갈 것입니다. 또는 바람직하게는 런타임에서 제공하는 메커니즘. 콜백은 외부 라이브러리에서 제공됩니다.

업데이트 : 나는 또한 지금 내 요구에 맞는 것으로 보이는 세마포어를 발견했습니다. 나는 누군가에게 더 나은 아이디어가 있다면 누군가에게 물을 것이다./다른 누군가도 이것을 유용하다고 생각할 것이다.

+0

** 당신이하고 싶은 일에 대해 ** 매우 구체적 일 수 있습니까? 당신이 원하는 것은'Monitor.Wait'와'Monitor.Pulse' /'Monitor.PulseAll'로 할 수 있습니다. –

+0

@Marc @Marc 자신의 작업을 요청하는 여러 스레드를 동시에 동기화하려고합니다. 내 문제는 요청을 시작할 때부터 콜백이 호출 될 때까지 작업을 수행한다는 것입니다. MSDN의 Monitor를 보면, 나는 enter를 호출 할 수없고 2 개의 다른 스레드에 남겨 둘 수 없었다. 펄스를 사용하려면 리소스에 대한 액세스를 직접 관리하는 논리를 작성해야합니다. –

+2

@AndreasReiff는 세마포어를 원하는 것 같습니다. –

답변

2

문제를 해결하는 간단한 방법은 AutoResetEvent을 사용하는 것입니다. 스레드에서 대기하고 다른 스레드에서 잠금을 해제하도록 알립니다.

+0

다른 유용한 링크 http://www.albahari.com/threading/part2.aspx#_AutoResetEvent –

+0

@ ken2k 나는 비동기 호출을 동기식으로 만들기 위해 이것을 실제로하고 있습니다 : 호출자가 작업을 요청합니다 이벤트를 통해 콜백을 기다립니다. 하지만 지금은 같은 시간에 작업을 요청하는 여러 스레드를 동기화하고 싶습니다. 이것은 금지되어 있습니다. –

+1

@AndreasReiff _several_ threads를 동기화하려면 세마포어를 사용해야합니다. – ken2k

관련 문제