2014-11-06 3 views
0

일반적인 생산자/소비자 문제가 발생하여 2 개의 스레드를 동기화하려고합니다. C# Compact Framework에서 Suspend() 및 Resume()의 대안을 찾고 싶습니다. 그들은 모두 :(CF에서 지원 을이 arent 내가 EventWaitHandle을 기반으로 같은 것을 사용하는 몇 가지 예, 발견 :..스레드를 일시 중단하고 다시 시작하는 방법

 private EventWaitHandle ewh = new AutoResetEvent(); 

을하지만 문제는 AutoResetEvent 컴팩트 프레임 워크의 일부를 밤은이다 나는 싶습니다 가 EventWaitHandle를 사용하여 이러한 생산자/소비자 문제를 해결하는 또 다른 방법이 있는지 알고있다. 을 내가 AutoResetEvent는 EventWaitHandle에서 파생 것을 알고있다. EventWaitHAndle의 다른 서브 클래스는 당신이 알고 무엇입니까?

+1

모니터 클래스는 스위스 군용 동기화 칼입니다. ".net 모니터 생산자 소비자 알고리즘"에 대한 많은 구글 조회수는 자신의 것을 고안하지 마십시오. –

답변

1

을 찾은 것처럼, 어떤 자동 리셋 이벤트가 없습니다. 하지만 당신은 CreateEvent 및 WaitForSingleObject 등 pinvoke를 사용하여 해결할 수 있습니다. 또는, 만약 당신이 simp 객체에 대한 액세스를 동기화하려면 '잠금'객체와 함께 잠금을 사용하기 만하면됩니다.

thread1 동안 (사실) { 잠금 (myLockObject) { 액세스 공유 객체 (들) } 에 Thread.sleep (1000) }

thread2 동안 : 사용은 의사 코드에 (TRUE) { 잠금 (myLockObject) { 액세스 공유 객체 (들) } 에 Thread.sleep는 (1100) }

각 스레드는 동일한 개체를 잠급니다 한 번에 하나의 스레드 만 공유 객체에 액세스 할 수 있습니다. 잠금 오브젝트가 다른 코드 행 (여기서는 다른 스레드에 의해)에 의해 잠겨 있지 않은 경우에만 잠금 안의 코드가 실행됩니다. 이것을 사용하여 스레드를 일시 중단하고 다시 시작할 수 있습니다. Lock 객체는 공유 var에 동기화 된 액세스를 사용하도록 설계되었습니다.

OTOH는 이미 언급 한 것처럼 기본 CreateEvent, WaitForSingleObject, SetEvent API 함수를 pinvoke합니다.

0

나는 Compact Framework에서 실제로 AutoResetEvent가 있음을 사과해야합니다. 동기화에 Monitor 클래스를 사용하도록 제안하신 Hans Passant에게 감사드립니다.

관련 문제