2013-03-15 3 views
30

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

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

ответ

28

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

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

Более эффективный по-прежнему IORef и atomicModifyIORef (CAS), но это очень ограничено тем, что вы можете с ним сделать.

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

+1

Эффективность, хороший 'нах.Я полагал, что они были так же хороши, так морали истории: используйте TVar, если вам требуется транзакционное обновление, иначе используйте MVar **, потому что это замедлит ваше многопоточное приложение значительно меньше ** –

+2

Может кто-нибудь определить фактическую разницу в скорости ? (Предположительно, это сложно измерить, так как оно зависит от фактических взаимодействий потоков ...) – MathematicalOrchid

+2

@MathematicsOrchid игнорирует проблемы параллелизма: чтение и запись 'IORef' будут вашими самыми быстрыми операциями, но GHC 7.8 поставляется с некоторыми улучшениями в« MVar », что принесите 'takeMVar/putMVar' за несколько нс' read/writeIORef' (скажем, 9.7/4.6 против 3.7/7/3 на моей машине (<обычный отказ от лжи и контрольных показателей здесь)), и у нас также есть новый очень быстрый 'readMVar' (когда MVar полон конечно). – jberryman

28

MVar

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

TVAR

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

IORef

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

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

+2

Вы ссылаетесь на общие MVar для обмена потоками, не должны ли они использоваться только для однонаправленной связи, хотя, если оба потока обновляют один и тот же MVar для разговора и вперед, у них будут условия гонки? –

+0

Вы правы. Я не имел в виду, что оба потока будут обновлять один и тот же «MVar», я сделаю это более ясным. – cdk

+4

Можете добавить примечание о голоде. MVars гарантированно будут честными, а телевизоры - нет. – hammar

Смежные вопросы