Как предотвратить совместное использование некоторого значения (или состояния) между потоками?

#haskell

#haskell

Вопрос:

Скажем, я пишу библиотеку, которая предоставляет ReaderT монаду, которая выглядит как…

 data LibEnv = LibEnv { envThreadUnsafeResource :: _whatever }

type LibraryT = ReaderT LibEnv
  

Как мне запретить пользователю моей библиотеки вызывать forkIO из MonadIO m => LibraryT m монады без повторной инициализации envThreadUnsafeResource ?

Ответ №1:

Я бы предложил _whatever перенести в a Pool _whatever из resource-pool библиотеки, которая обычно используется для управления подключениями к базе данных и т.д.

Чтобы создать a Pool _whatever , вам нужно будет предоставить a IO _whatever для построения ресурса и a _whatever -> IO () для уничтожения ресурса. Если вы затем получите доступ _whatever , используя только с помощью withResource функции, то вы можете получить свежую инициализацию _whatever независимо от того, в каком потоковом контексте вы находитесь.