О скоупах…

Aug 02, 2015 22:52



А вот ещё одна хитрая задачка. Положим у нас есть несколько устройств, которые мы можем как-то дёргать через DevHnd a (где a - тип-параметр характеризующий устройство). Проблема в том, что если два треда будут рулить устройством одновременно, то результат будет трудно предсказать. Хорошо, вводим концепцию владения устройством: управлять устройством Read more... )

haskell, думы

Leave a comment

Comments 7

не зная хаскель вот совсем johnnie_pr August 3 2015, 09:15:25 UTC
флаги состояния - не?

Reply

RE: не зная хаскель вот совсем nikita_timofeev August 3 2015, 21:19:24 UTC
Ммм… Флаги состояния чего?

Reply

RE: не зная хаскель вот совсем johnnie_pr August 4 2015, 07:26:13 UTC
состояния устройства. Как я понимаю, самая медленная часть системы - это общение с внешними устройствами. и добавление пары лишних операций, которые будут в коде систему особо затормозить не должно
объявляем глобальную переменную "туалет№1занят" и первое, что делает любой тред - проверяет ее состояние. если false - захватывает устройство и пишет true. последнее, что делает - проверяет, что устройство отработало всё, что он сказал и снова меняет флаг на false. И другие треды, вместо того чтобы дергать проверкой устройтво, которое в этот момент может быть занято чем-то важным - просто берут значение из памяти и становятся в очередь.

Reply

RE: не зная хаскель вот совсем nikita_timofeev August 4 2015, 09:14:47 UTC
В принципе всё правильно, но есть нюанс: код треда состоит из функций, которые берут идентификатор устройства и что-то с ним делают. Никто не мешает тебе взять идентификатор устройства, которое ты не занял в этом треде и попытаться им порулить внутри своей якобы защищённой секции
main :: IO ()
main = do
dev1 <- mkDev
dev2 <- mkDev
dev3 <- mkDev

withSomething dev1 dev2 $ do
doBuzWith dev1
doFooWith dev3
Что в такой ситуации должна делать функция doFooWith? Просто изменить состояние устройства понадеявшись что в данный момент этого никто больше не делает? Проверить занято ли это устройства этим скоупом и если нет то попытаться подождать пока оно освободиться и захватить? Проверить занято ли это устройства этим скоупом и если нет то выбросить исключение?

Reply


Leave a comment

Up