C++ 11 std :: hat condition_variable, seine Wartefunktion istEreignisbenachrichtigung ohne Mutex
template< class Predicate >
void wait(std::unique_lock<std::mutex>& lock, Predicate pred);
Es erfordert eine Mutex.
Soweit ich es verstehe - seine notify_one kann ohne Synchronisierung aufgerufen werden (ich weiß, die idiomatische Art ist, es mit einem Mutex zu verwenden).
Ich habe ein Objekt, die intern bereits synchronisiert ist - so dass ich es nicht einen Mutex müssen schützen. Ein Thread sollte auf ein Ereignis warten, das mit diesem Objekt verknüpft ist, und andere würden benachrichtigt.
Wie macht man eine solche Benachrichtigung ohne Mutex in C++ 11? I.e. Es ist leicht mit einer condition_variable zu machen, aber es benötigt einen Mutex. Ich dachte über die Verwendung eines gefälschten Mutex-Typs nach, aber std :: mutex wurde in die Wait-Schnittstelle eingefügt.
Eine Option ist, ein std :: atomic_flag + Schlaf abzufragen, aber ich mag es nicht zu schlafen.
Das ist genau was ich suche, war mir nicht bewusst. Vielen Dank! – qble
"Es stellt sich heraus, dass es eine einfache std :: condition_variable zusammen mit einem std :: shared_ptr zu einem std :: mutex verwendet, so dass es definitiv einen Overhead gibt, ohne tiefer zu graben." - Interessant, sperrt es interne Mutex innerhalb von ** notify_one **? Was ist mit plain std :: condition_variable - sperrt es jeden Mutex mit ** notify_one **? – qble
"In diesem Fall würde ich Ihnen wahrscheinlich empfehlen, Ihren Fall neu zu gestalten, so dass die Synchronisation wirklich nur durch einen Mutex erfolgt, der eine einfache Zustandsvariable schützt."- Ich muss nicht notify_one schützen. Warum brauche ich Mutex, die nur innerhalb eines Threads verwendet werden? – qble