2016-07-26 15 views
3

Ich möchte Warteschlange erstellen während maximale Größe mit Semaphor definieren.Warum brauche ich Sperren mit Semaphor

enque Artikel hinzufügen und deque werden Artikel

public void Enque(T item) 
    { 
     semaphore.WaitOne(); 
     privateQueue.Enqueue(item); 

löschen Während ähnliche Situationen googeln ich herausgefunden, dass manchmal Schlösser wie diese

semaphore.WaitOne(); 
lock(lock) 
privateQueue.Enqueue(item); 

verwendet Warum müssen wir Schlösser hinzufügen mit Semaphor? Danke

+0

Schreiben thread-sicheren Code ist * schwer *. Einige großartige Bücher zum Thema: "Concurrent Programming unter Windows", "Java Concurrency in Practice" (überraschend relevant für C# -Entwickler, sofern Sie wissen, wie man die APIs anpasst) –

+0

Was ist die Initialisierung von Semaphore? Wenn es 'new Semaphore (0, 1)' ist, müssen Sie möglicherweise keine Sperre verwenden, da die Verwendung eines solchen Semaphors nur einen Threadzugriff auf die Ressource zulässt. –

Antwort

1

Wenn Ihr Semaphor den gleichzeitigen Zugriff auf die Warteschlange zulässt (indem eine maximale Anzahl von> 1 zugelassen wird), muss das Einreihen und Entfernen aus der Warteschlange thread-sicher erfolgen.

Alternativ können Sie eine Warteschlange verwenden, die bereits Thread-sicher ist, wie ConcurrentQueue<T>, und dann würden Sie nicht eine Sperre müssen - vorausgesetzt, dass die Sperre nur die Warteschlange geschützt selbst. Wenn die Sperre mehr als das umfasst (das ist schwer zu sagen aus dem Code-Snippet in Ihrer Frage), dann brauchen Sie es vielleicht trotzdem.