#c #c 14 #std #c 17
#c #c 14 #std #c 17
Вопрос:
C 11 представил std::mutex
и его расширенную версию — std::timed_mutex
.
Однако в c 14 у нас есть std::shared_timed_mutex
, но его «родительский», std::shared_mutex
который будет добавлен в c 17.
Есть ли какое-либо разумное объяснение этому?
Если я не собираюсь использовать «синхронизированную» функциональность std::shared_timed_mutex
, будет ли это хуже (медленнее, потребляющее больше ресурсов), чем предлагается std::shared_mutex
?
Ответ №1:
В Shared mutex изначально было указано время, и он был вызван shared_mutex
.
Разработчик (msvc iirc) отметил, что они могли бы реализовать это «дешевле» без учета времени. В частности, SRWLOCK
это существующий примитив в Windows, которого достаточно для реализации общего мьютекса, но для timed требуется дополнительное оборудование. (Через @t.c.). (Однако я считаю, что это не только проще, потому что уже написано, но и существенно дороже, по крайней мере, в Windows x86 / 64)
Было слишком поздно добавлять новый тип в стандарт, но не слишком поздно переименовывать его.
Итак, он был переименован в shared_timed_mutex
, а несвоевременная версия добавлена в следующий стандарт.
Вот по крайней мере одна из статей, связанных с переименованием.
Мы предлагаем переименовать shared_mutex в shared_timed_mutex:
(a) для согласованности с другими мьютексами (исправление несоответствия именования);
(b) чтобы оставить место для shared_mutex, который может быть более эффективным на некоторых платформах, чем shared_timed_mutex.
Комментарии:
1. @MartinBonner Нет,
CRITICAL_SECTION
это не общий мьютекс (он же блокировка чтения / записи).SRWLOCK
это примитив.2. О черт! Я запутался между «общим» и «рекурсивным»!