История изменений
Исправление alysnix, (текущая версия) :
Не поддерживает ни рекурсию, ни апргейд, нихера.
базовый мьютекс не рекурсивный.
рекурсивный мьютекс получается допиской примерно двух строк к базовому. общепонятный псевдокод:
RecursiveMutex::lock_recursive() {
if (not this->locked()) this->lock(); ///если не залочен, залочить нерекурсивно
++this->lock_counter; ///увеличить счетчик локов
}
RecursiveMutex::unlock_recursive() {
if (not this->locked_by_me()) panic(); ///нелишняя проверочка, их может быть несколько
if (--this->lock_counter == 0) this->unlock(); //нерекурсивный анлок
}
итак. базовый мьютекс - нерекурсивный. рекурсивный получается из базового.
применяются они для разных сценариев.
рекурсивный мьютекс:
за: упрощает жизнь при безбашенно рекурсивном или вложенном по локам коде - например цикл под локом, гды вызывают функции, что сами хотят этот лок.
против: даже повторный рекурсивный лок, требует проверки нерекурсивной залоченности, и анлока с проверками, что есть время. если рекурсивные функции мелкие, то можно нехило упасть по производительности. то есть если охраняемый код сравним по сложности с кодом рекурсивных локов/анлоков. это мы еще не рассматривали всякие там кеши, поскольку нужен доступ к обьекту мьютекса.
нерекурсивный мьютекс:
ЗА: есть база для рекурсивного. можно писать самый быстрый код, правильно приготовив последний.
обьявлять базовый нерекурсивный мьюьекс - «студенческим поделием» - это смело. он есть везде, где есть треды. смотри позикс и прочее.
не надо обьявлять реализации чего-то там системного, из всяких яв и шарпов, каноническими. там сборка мусора и свои треды, может еще что, и потому там код может быть далеким от классики.
Исходная версия alysnix, :
Не поддерживает ни рекурсию, ни апргейд, нихера.
базовый мьютекс не рекурсивный.
рекурсивный мьютекс получается допиской примерно двух строк к базовому. общепонятный псевдокод:
RecursiveMutex::lock_recursive() {
if (not this->locked()) this->lock(); ///если не залочен, залочить нерекурсивно
++this->lock_counter; ///увеличить счетчик локов
}
RecursiveMutex::unlock_recursive() {
if (not this->locked()) panic(); ///нелишняя проверочка, их может быть несколько
if (--this->lock_counter == 0) this->unlock(); //нерекурсивный анлок
}
итак. базовый мьютекс - нерекурсивный. рекурсивный получается из базового.
применяются они для разных сценариев.
рекурсивный мьютекс:
за: упрощает жизнь при безбашенно рекурсивном или вложенном по локам коде - например цикл под локом, гды вызывают функции, что сами хотят этот лок.
против: даже повторный рекурсивный лок, требует проверки нерекурсивной залоченности, и анлока с проверками, что есть время. если рекурсивные функции мелкие, то можно нехило упасть по производительности. то есть если охраняемый код сравним по сложности с кодом рекурсивных локов/анлоков. это мы еще не рассматривали всякие там кеши, поскольку нужен доступ к обьекту мьютекса.
нерекурсивный мьютекс:
ЗА: есть база для рекурсивного. можно писать самый быстрый код, правильно приготовив последний.
обьявлять базовый нерекурсивный мьюьекс - «студенческим поделием» - это смело. он есть везде, где есть треды. смотри позикс и прочее.
не надо обьявлять реализации чего-то там системного, из всяких яв и шарпов, каноническими. там сборка мусора и свои треды, может еще что, и потому там код может быть далеким от классики.