2013-02-22 3 views
6

Java 응용 프로그램을 C#에 이식하는 부분은 C#에서 동기화 된 메시지 버퍼를 구현하는 것입니다. 동기화를 통해 스레드가 메시지를 쓰고 읽는 것이 안전해야한다는 것을 의미합니다.C#의 동기화 된 메서드

자바에서는 synchronized 메서드와 wait()notifyAll() 메서드를 사용하여 해결할 수 있습니다.

예 :

public class MessageBuffer { 
    // Shared resources up here 

    public MessageBuffer() { 
     // Initiating the shared resources 
    } 

    public synchronized void post(Object obj) { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff 
    } 

    public synchronized Object fetch() { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff and return the object 
    } 
} 

나는 C#에서 비슷한 일을 달성 할 수 있는가?

+1

관련 항목 : http://stackoverflow.com/questions/541194/c-sharp-version-of-javas-synchronized-keyword – sshow

+0

@stigok 관련 없음, 중복 됨 –

+0

중복되지 않음, wait() 및 notifyAll() – Dimme

답변

4

이 시도 :

using System.Runtime.CompilerServices; 
using System.Threading; 

public class MessageBuffer 
{ 
    // Shared resources up here 

    public MessageBuffer() 
    { 
     // Initiating the shared resources 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual void post(object obj) 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual object fetch() 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff and return the object 
    } 
} 
+3

에서 볼 수 있습니다. MethodImplOptions.Synchronized를 사용하는 것이 좋지 않습니다. 이는 " 각 방법에 대해 이것을 잠급니다. "교착 상태"는 교착 상태의 가능성을 높여주기 때문에 다소 위험한 것으로 간주됩니다. –

+1

나는 @MatthewWatson에 동의한다. MethodImplOptions.Synchronized를 피하고 대신 명시 적 잠금을 사용해야합니다. – Patrik

+0

질문은 C#에서이를 달성하는 방법 이었지만 더 바람직하지는 않았습니다. –

6

는 .NET에서 당신이

당신이 찾고있는 무엇
object oLock = new object(); 
lock(oLock){ 
    //do your stuff here 
} 

뮤텍스 또는 이벤트입니다에 같은 lock -statement를 사용할 수 있습니다. 당신은

ManualResetEvent mre = new ManualResetEvent(false); 
... 
mre.WaitOne(); 

를 통해 ManualResetEvent - 클래스를 사용하여 스레드 대기 할 수있는 다른 스레드는 결국

mre.Set(); 

는 계속 할 수있는 다른 스레드를 알리기 위해 호출합니다.

보기 here.

+0

'ManualResetEvent'가 '뮤텍스'세마포어로 대체 될 수 있습니까? – Dimme

+1

네,하지만 두 개가 필요합니다. 하나는 각 스레드에 신호를 보내기위한 것입니다. 이런 식으로 스레드 1이 신호를 보내는 객체를 생성하고 객체 2가 객체가 소비되었다는 신호를 보낼 때. 물론 많은 객체를 만들고 싶다면 다른 접근 방식을 선택할 수 있습니다. 그것은 상황에 달려 있습니다. 그러나 이벤트는 꽤 많은 상황에 적합합니다. [MSDN] (http://msdn.microsoft.com/en-us/library/ms173179.aspx)의 설명서를 참조하십시오. –