Когда/зачем использовать MVar над TVar
Я считаю, что TVar достаточно прост в работе, хотя MVar выглядит немного проще, а TVar - немного более функциональным.
Итак, мой вопрос довольно прост, какое условие я хочу поехать в MVar, а не в TVar? Я полагаю, что в любое время, когда мне не требуется транзакционное обновление, я может использовать MVar, но каким образом это мне помогает?
Ответы
Ответ 1
TVars безопаснее, но медленнее.
MVars может заходить в тупик, но гораздо эффективнее.
Еще эффективнее IORef
и atomicModifyIORef
(CAS), но это очень ограничено тем, что вы можете с ним сделать.
Это действительно безопасная сделка. ТВАРЫ полностью общие, очень безопасные. Все остальное меньше, в уменьшающемся масштабе.
Ответ 2
MVar
- может быть пустым
- используется для реализации синхронизации между потоками
- позволяет одностороннюю связь между потоками
- может быть быстрее, чем
TVar
в некоторых случаях
TVAR
- может не быть пустым
- атомные транзакции
- "разделяемая память" между потоками; может использоваться для реализации, например, кэша поиска, из которого несколько потоков могут читать/писать
- доступ - это линейное время в количестве операций в журнале транзакций.
- Долгосрочные транзакции уязвимы для голодания, если существует много более коротких транзакций, что мешает им успешно совершать
IORef
- изменяемая указательная ссылка
- часто используется для деструктивных
IO
записей/обновлений
- имеет некоторые атомарные операции CAS, но вам лучше использовать
TVar
На самом деле нет жесткого и быстрого правила использования MVar
vs TVar
, но я обычно думаю о том, будет ли мой контейнер когда-либо "пустым" (MVar
). Или мне нужно будет выполнить атомные блоки модификаций моей переменной (TVar
)