Föredrar std::shared_mutex författare framför läsare?

Föredrar std::shared_mutex författare framför läsare?

Den officiella C++-standarden anger inte std::shared_mutex politik. Förklaringen finns i det ursprungliga N2406-förslaget (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#shared_mutex_imp) i shared_mutex Reference Implementation avsnitt:

Jämförelse med QReadWriteLock-implementering (det vill säga skrivföredrar ):

Det är sant för förslagets shared_mutex också för att se till att författaren inte kommer att vänta för evigt om nya läsare fortsätter att komma.

Det är INTE sant för förslagets shared_mutex , läsare och författare har samma prioriteringar i det här fallet.

Men tyvärr innehåller det slutliga C++ Standard-dokumentet inte denna referensimplementering. Observera att trots att GCC innehåller std::shared_mutex implementering som är baserad på N2406 referensimplementering, men på Linux används den inte som standard, den använder pthread_rwlock_t från POSIX-trådar lib (kontrolleras av _GLIBCXX_USE_PTHREAD_RWLOCK_T alternativ i c++config.h ). pthread_rwlock_t kan vara läs- eller skrivföredrar beroende på systeminställning och tillämpad pthread attribut. Se relaterad fråga för detaljer:Hur man förhindrar skribentsvält i ett lässkrivlås i pthreads


Det specificeras inte av standarden.

POSIX anger inte hur pthread rwlocks måste avgöra vilken låsbegäran som nästa lyckas, så det skulle vara omöjligt att implementera C++ std::shared_mutex i termer av standard pthreads om den hade ett sådant krav.

Det är verkligen en rimlig egendom, men det är inte den enda rimlig egendom.

Till exempel har GLIBC en pthreads-tillägg som låter dig välja mellan tre rwlock-policyer:rekursiv föredrar läsare, rekursiv föredrar författare och icke-rekursiv föredrar skrivare. Förmodligen rekursiv föredrar författare är inte det korrekta valet för alla program.

Dessutom gör detta ingenting för att säkerställa att författare inte blockeras för alltid av andra författare .

Den intuitivt-perfekt-rättvisa lösningen är shared-reader-preferred-exclusive-FIFO-ordered-writer, men denna är onödigt tung för många ändamål.

Qt-versionen kan vara exakt perfekt för Qts användningsfall, men den är bara en punkt på det lätta/effektiva -- tunga/rättvisa spektrumet.