Wie verändern die rekursive locking-Verhalten von Windows-Mutex?
Windows-Mutex scheint damit eine erworbene Sperre wieder erworben zu werden (rekursiv), wenn der thread derzeit im Besitz der Sperre versucht, es zu erwerben.
Aber, pthread posix-basiert sperren nicht erlauben, solch ein Verhalten.
Gibt es eine compile-Zeit-makro oder irgendwelche Einstellungen, die das windows-mutex-Verhalten in der gleichen Weise wie die pthread mutex?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Solange Sie das Programm in Windows, vermeiden reimplementing das Verhalten seiner Mutex. Es wird re-Teilnehmer im gleichen thread ist absolut unerlässlich für den definierten Verhalten.
Einem sync-Objekt ohne thread-Affinität ist ein semaphor, zählt zu 1. Verwenden CreateSemaphore().
Fwiw, es ist sehr merkwürdig, dass Sie brauchen diese Art von Verhalten. Es klingt wie Sie versuchen, zu verwenden die gleichen sync-Objekt an mehreren stellen unpassend. Sie können die semaphore aber Sie verlieren potenzielle Parallelität. Erwägen Sie die Verwendung von mehr als einem mutex statt.
Sie nicht ändern kann die Tatsache, dass Windows Mutexe sind rekursiv. Und während der Posix-threads sind nicht standardmäßig rekursiv, Sie kann Verwendung
pthread_mutexattr_settype()
mit derPTHREAD_MUTEX_RECURSIVE
flag zu machen, ist so.Sperren einer mutex in Windows ist tatsächlich eine sehr teure operation, und am besten geeignet, um inter-Prozess-synchronisation. Für ein mutex verwendet, die nur innerhalb eines einzigen Prozesses, einer kritischen Abschnitt ist in der Regel verwendet, aber diese sind re-entrant auch. Als nobugz Staaten, müssen Sie verwenden einen semaphor, initialisiert mit einer maximalen Anzahl von 1, um nicht-rekursive synchronisation.
Einem semaphor-Objekt ist wie eine Besondere Zähler, das kann atomar inkrementiert und dekrementiert mehrere threads (oder Prozesse, wenn erstellt, freigegeben). Durch die Schaffung eines mit einer maximalen Anzahl von 1, erhalten Sie die nicht-rekursive Verhalten, die Sie benötigen.
Schlage ich Lese - /Schreib-locks (aka SRW). Wie Windows-Mutex, Sie sind nicht rekursiv. Wie Kritische Abschnitte, Sie sind leicht und tun nicht Aufruf-kernel, wenn Sie frei sind (Benchmarks).
Haben Sie einen Blick auf diese Artikel unter "fast mutex'.
Diese Art von Mutexe werden nicht rekursiv erworben.
Natürlich, man müsste schauen in wie implementieren Sie in C