Подтвердить что ты не робот

Когда/зачем использовать MVar над TVar

Я считаю, что TVar достаточно прост в работе, хотя MVar выглядит немного проще, а TVar - немного более функциональным.

Итак, мой вопрос довольно прост, какое условие я хочу поехать в MVar, а не в TVar? Я полагаю, что в любое время, когда мне не требуется транзакционное обновление, я может использовать MVar, но каким образом это мне помогает?

4b9b3361

Ответ 1

TVars безопаснее, но медленнее.

MVars может заходить в тупик, но гораздо эффективнее.

Еще эффективнее IORef и atomicModifyIORef (CAS), но это очень ограничено тем, что вы можете с ним сделать.

Это действительно безопасная сделка. ТВАРЫ полностью общие, очень безопасные. Все остальное меньше, в уменьшающемся масштабе.

Ответ 2

MVar

  • может быть пустым
  • используется для реализации синхронизации между потоками
  • позволяет одностороннюю связь между потоками
  • может быть быстрее, чем TVar в некоторых случаях

TVAR

  • может не быть пустым
  • атомные транзакции
  • "разделяемая память" между потоками; может использоваться для реализации, например, кэша поиска, из которого несколько потоков могут читать/писать
  • доступ - это линейное время в количестве операций в журнале транзакций.
  • Долгосрочные транзакции уязвимы для голодания, если существует много более коротких транзакций, что мешает им успешно совершать

IORef

  • изменяемая указательная ссылка
  • часто используется для деструктивных IO записей/обновлений
  • имеет некоторые атомарные операции CAS, но вам лучше использовать TVar

На самом деле нет жесткого и быстрого правила использования MVar vs TVar, но я обычно думаю о том, будет ли мой контейнер когда-либо "пустым" (MVar). Или мне нужно будет выполнить атомные блоки модификаций моей переменной (TVar)