LINUX.ORG.RU

История изменений

Исправление 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(); //нерекурсивный анлок
}

итак. базовый мьютекс - нерекурсивный. рекурсивный получается из базового.

применяются они для разных сценариев.


рекурсивный мьютекс:

за: упрощает жизнь при безбашенно рекурсивном или вложенном по локам коде - например цикл под локом, гды вызывают функции, что сами хотят этот лок.

против: даже повторный рекурсивный лок, требует проверки нерекурсивной залоченности, и анлока с проверками, что есть время. если рекурсивные функции мелкие, то можно нехило упасть по производительности. то есть если охраняемый код сравним по сложности с кодом рекурсивных локов/анлоков. это мы еще не рассматривали всякие там кеши, поскольку нужен доступ к обьекту мьютекса.


нерекурсивный мьютекс:

ЗА: есть база для рекурсивного. можно писать самый быстрый код, правильно приготовив последний.


обьявлять базовый нерекурсивный мьюьекс - «студенческим поделием» - это смело. он есть везде, где есть треды. смотри позикс и прочее.


не надо обьявлять реализации чего-то там системного, из всяких яв и шарпов, каноническими. там сборка мусора и свои треды, может еще что, и потому там код может быть далеким от классики.