2016-10-23 1 views
15

C++ 11 introduit std::mutex et sa version étendue - std::timed_mutex.Pourquoi shared_timed_mutex est défini en C++ 14, mais shared_mutex en C++ 17?

Cependant, en C++ 14 nous avons std::shared_timed_mutex, mais son 'parent', le std::shared_mutex va être ajouté en C++ 17.

Y a-t-il une explication raisonnable à cela?

Si je ne vais pas utiliser la fonctionnalité 'temporisée' de std::shared_timed_mutex, est-ce que ça va être pire (plus lent, consommant plus de ressources) que le std::shared_mutex proposé?

Répondre

18

Le mutex partagé comportait à l'origine un minutage et s'appelait shared_mutex.

Un implémenteur (msvc iirc) a noté qu'ils pourraient l'implémenter "moins cher" sans synchronisation. En particulier, SRWLOCK est une primitive existante sur Windows qui est suffisante pour implémenter le mutex partagé, mais qui nécessite une machine supplémentaire. (Via @ t.c.). (Cependant, je crois que ce n'est pas seulement plus facile parce que déjà écrit, mais aussi fondamentalement plus cher, au moins sur Windows x86/64)

Il était trop tard pour ajouter un nouveau type à la norme, mais pas trop tard pour le renommer.

Donc, il a été renommé en shared_timed_mutex, et la version non-temporisée a été ajoutée dans la prochaine norme.

Here est au moins l'un des papiers impliqués dans le changement de nom.

Nous vous proposons de renommer shared_mutex à shared_timed_mutex:

(a) pour la cohérence avec les autres mutex (incohérence nommant la fixation); (B) pour laisser place à un mutex partagé qui peut être plus efficace sur certaines plateformes que shared_timed_mutex.

+4

@MartinBonner Non, 'CRITICAL_SECTION' n'est pas un mutex partagé (alias lecteur/graveur). 'SRWLOCK' est la primitive. –

+0

Oh putain! J'ai été confondu entre "partagé" et "récursif"! –