Ответ 1
Это не вопрос блокировки, это о том, что означает ссылка:
-
TVar
является изменчивой ссылкой внутриSTM
, представляющей общее общее состояние. Вы создаете его, сохраняя значение, вы можете читать и писать ему и т.д. Это очень похоже наIORef
илиSTRef
(что в любом случае одинаково). -
TMVar
- ссылка на слот, который потоки могут использовать для связи. Он может быть создан с сохранением значения или пустым. Вы можете поместить в него значение, которое, если оно уже заполнено, пока кто-то еще не опустошит его; или вы можете извлечь из него значение, которое, если оно уже пустое, пока кто-то не заполнит его. Это, очевидно, похоже наMVar
, но для многих распространенных применений проще было бы рассматривать его как одноэлементную очередь, используемую для сообщающейся пары производитель/покупатель.
Короче говоря, TVar
является общим общим состоянием, используйте его, если вы хотите получать атомные обновления данных из произвольных мест. TMVar
- это примитив синхронизации, используйте его, если вы хотите, чтобы поток подождал, пока что-то станет доступным, а другой ждет чего-то, что необходимо.
Также обратите внимание на TChan
, который реализуется примерно как два места хранения TVar
в связанном списке, где каждая прямая ссылка также является TVar
и работает как неограниченная очередь для связи.
Все они могут быть использованы несколько разными способами, конечно же - вы можете заглянуть в значение TMVar
, не удаляя его, например, если вы хотите, чтобы сценарий, в котором несколько потоков все ждут одного ресурса чтобы стать доступным, но он никогда не "израсходовался".