LINUX.ORG.RU

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

Исправление monk, (текущая версия) :

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

Почему?

Если вводим тип «захваченный мьютекс» и функцию, которая его захватывает и возвращает, то в других функциях можем требовать аргумент с типом «захваченный мьютекс». Чтобы потом он был гарантированно отпущен, можно сделать функцию которая выполнит защищённое мьютексом и отпустит его:

withMutex :: LockedMutex -> (LockedMutex -> IO a) -> IO a
withMutex m f = do
  r <- f m
  unlock m
  return r

Исходная версия monk, :

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

Почему?

Если вводим тип «захваченный мьютекс» и функцию, которая его захватывает и возвращает, то в других функциях можем требовать аргумент с типом «захваченный мьютекс». Чтобы потом он был гарантированно отпущен, можно сделать функцию которая выполнит защищённое мьютексом и отпустит его:

withMutex :: LockedMutex -> (LockedMutex -> IO a) -> IO a
withMutex m f = do
  r <- f m
  unlock m
  r