Ich werde über Mutex vs Binary-Semaphore sprechen. Sie verwenden offensichtlich Mutex, um zu verhindern, dass ein anderer Thread gleichzeitig auf Daten in einem Thread zugreift.
(Angenommen, Sie haben gerade lock () aufgerufen und greifen gerade auf Daten zu. Dies bedeutet, dass Sie nicht erwarten, dass ein anderer Thread (oder eine andere Instanz desselben Thread-Codes) auf dieselben Daten zugreift, die von gesperrt sind Gleicher Mutex. Wenn also derselbe Thread-Code, der auf einer anderen Thread-Instanz ausgeführt wird, auf die Sperre trifft, sollte lock () den Kontrollfluss blockieren.)
Dies gilt für einen Thread, der einen anderen Thread-Code verwendet, der ebenfalls auf dieselben Daten zugreift und der auch von demselben Mutex gesperrt wird.
In diesem Fall sind Sie noch dabei, auf die Daten zuzugreifen, und es kann beispielsweise weitere 15 Sekunden dauern, bis die Mutex-Entsperrung erreicht ist (sodass der andere Thread, der in der Mutex-Sperre blockiert wird, entsperrt wird und die Steuerung dies zulässt Zugriff auf die Daten).
Erlauben Sie jemals einem anderen Thread, denselben Mutex zu entsperren, und lassen Sie wiederum den Thread, der bereits in der Mutex-Sperre wartet (blockiert), die Blockierung aufzuheben und auf die Daten zuzugreifen? (Ich hoffe, Sie haben verstanden, was ich hier sage.)
Gemäß der vereinbarten universellen Definition
- mit "mutex" kann das nicht passieren. Kein anderer Thread kann die Sperre in Ihrem Thread aufheben
- Mit „Binärsemaphor“ kann dies passieren. Jeder andere Thread kann die Sperre in Ihrem Thread aufheben
Wenn Sie also ganz besonders darauf bedacht sind, Binärsemaphor anstelle von Mutex zu verwenden, sollten Sie beim „Scoping“ der Sperren und Entsperrungen sehr vorsichtig sein. Ich meine, dass jeder Kontrollfluss, der jede Sperre trifft, einen Entsperraufruf und auch treffen sollte Es sollte keine "erste Entsperrung" geben, sondern immer "erste Sperre".