квотирование [Thread.mutex.recursive]:
Поток, которому принадлежит
recursive_mutex
объект может приобрести дополнительные уровни владения, позвонивlock()
или жеtry_lock()
на этом объекте. Не определено, сколько уровней владения может быть получено одним потоком. Если поток уже приобрел максимальный уровень владения дляrecursive_mutex
объект, дополнительные звонкиtry_lock()
не удастся, и дополнительные вызовыlock()
должен выбросить исключение типаsystem_error
,
Есть ли нижняя граница больше 1 для «максимальный уровень владения«? Как насчет рекурсивных мьютексов pthread?
Нижний предел не указан в стандарте. Это, вероятно, намеренно.
Более старые стандарты (я думаю) использовали для обеспечения более низких пределов для подобных вещей. В результате люди написали стандарты кодирования, в которых говорилось, что вы не можете использовать больше, чем эти нижние пределы. Например: Это была (и я думаю, до сих пор) реализация, определяющая, сколько символов внешнего символа было значимым при сравнении на равенство. Так a_very_very_long_name_indeed_with_extra_padding
а также a_very_very_long_name_indeed_with_extra_paddingX
может рассматриваться как один и тот же символ. Минимальная длина была указана как 8, а стандарты кодирования были написаны с указанием «максимальная длина внешнего символа — восемь символов».
Что касается правдоподобной нижней границы этого значения: я легко могу представить, что счетчик может быть упакован битами в какое-то другое поле, так что все это может быть обновлено атомарно с помощью подходящей инструкции. Таким образом, это может быть намного меньше 32 бит. (Он действительно должен быть достаточно большим для максимальной глубины стека вызовов, поэтому в стесненных условиях 31 может быть достаточно хорошим.)
Других решений пока нет …