Почему shared_timed_mutex определен в c 14, но shared_mutex в c 17?

#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. О черт! Я запутался между «общим» и «рекурсивным»!