А вот ещё одна хитрая задачка. Положим у нас есть несколько устройств, которые мы можем как-то дёргать через DevHnd a (где a - тип-параметр характеризующий устройство). Проблема в том, что если два треда будут рулить устройством одновременно, то результат будет трудно предсказать. Хорошо, вводим концепцию владения устройством: управлять устройством
(
Read more... )
Comments 7
Reply
Reply
объявляем глобальную переменную "туалет№1занят" и первое, что делает любой тред - проверяет ее состояние. если false - захватывает устройство и пишет true. последнее, что делает - проверяет, что устройство отработало всё, что он сказал и снова меняет флаг на false. И другие треды, вместо того чтобы дергать проверкой устройтво, которое в этот момент может быть занято чем-то важным - просто берут значение из памяти и становятся в очередь.
Reply
main :: IO ()
main = do
dev1 <- mkDev
dev2 <- mkDev
dev3 <- mkDev
withSomething dev1 dev2 $ do
doBuzWith dev1
doFooWith dev3
Что в такой ситуации должна делать функция doFooWith? Просто изменить состояние устройства понадеявшись что в данный момент этого никто больше не делает? Проверить занято ли это устройства этим скоупом и если нет то попытаться подождать пока оно освободиться и захватить? Проверить занято ли это устройства этим скоупом и если нет то выбросить исключение?
Reply
Leave a comment