Мне повезло, что реализация GHC TVar
s равна lock-free, но не wait-free. Существуют ли какие-либо реализации, которые не доступны (например, пакет Hackage)?Данные «Wait-free» в Haskell
ответ
Ваш вопрос: «Есть ли какие-либо реализации без ожидания?» немного неполна. STM (и, следовательно, TVar
) довольно сложна и имеет встроенную поддержку в компилятор - вы не можете правильно ее построить с помощью примитивов Haskell.
Если вы ищете какой-либо контейнер данных, который допускает мутацию и может быть неблокирующим, то вы хотите, чтобы IORef
s или MVar
s (но они могут блокироваться, если значение не доступно).
Вы _can_ реализуете STM самостоятельно. В компилятор его не нужно жестко подключать. (Хотя, вероятно, это более эффективно.) См. Вопрос № 15 «The Monad Reader» для исходного кода. – MathematicalOrchid
'IORef' не может быть пустым и не будет блокироваться, как я понимаю. –
@ У Math Haskell нет никаких незакрепленных/CAS примитивов для истинного ATM afaik, поэтому я с удовольствием увижу MR, когда у меня будет время. –
Wait-freedom - термин от распределенных вычислений. Алгоритм без ожидания, если поток (или распределенный узел) способен корректно завершить работу, даже если все входные данные из других потоков задерживаются/теряются в любое время.
Если вам небезразлична последовательность, то вы не можете гарантировать свободу ожидания (при условии, что вы всегда хотите закончить правильно, то есть гарантировать доступность). Это следует из теоремы CAP [1], так как свобода ожидания по существу подразумевает допустимость разделов.
Звучит как смешение терминов для меня. Как правило, «без ожидания» просто означает, что все потоки продвигаются вперед. Например (в C++, извините), функция 'inc' не будет ждать' std :: atomic
@GManNickG: Если вы просто рассматриваете 'inc()' как атомную операцию с нулевым временем, я согласен, 'inc()' будет без ожидания. Однако, если вы посмотрите, как фактически реализована атомарность 'inc()', она должна либо влечь за собой некоторую блокировку, либо некоторую форму «повторной попытки», чтобы гарантировать согласованность, поскольку существует вероятность того, что 2 потока прочитают одно и то же значение одновременно один из них пишет.Поэтому, если вы посмотрите на этот уровень, 'inc()' не будет ждать, потому что один из потоков должен перечитать значение перед тем, как идти вперед. – Peter
Справедливо, я сделал некоторые предположения, не указав. Но есть атомарность аппаратного уровня, которая на программном уровне блокируется и не требует отклика. – GManNickG
- 1. Haskell Тип в данные
- 2. «Зависимые дополнительные» данные в Haskell
- 3. Гетерогенные данные. Карта в Haskell
- 4. Haskell Неизменяемые данные
- 5. Данные Haskell Nat
- 6. Haskell данные UnWrap
- 7. Haskell: список Измените данные
- 8. Haskell: предотвращающая данные модификации
- 9. Haskell показывают данные
- 10. Haskell данные:> Конструктор значение
- 11. Данные Haskell, пользовательские значения строк
- 12. Haskell: Алгебраические данные против кортежей
- 13. Haskell типов, определенный пользователь данные
- 14. Haskell использовать данные POST ЗАПРОС
- 15. Haskell: Показать тип рекурсивной данные
- 16. Haskell: Получить данные в Parsec IO
- 17. Получить данные из двух состояний в Haskell
- 18. Haskell «данные» эквивалент в объектно-ориентированном языке
- 19. Переменные ссылки на неизменные данные в Haskell
- 20. Случайные данные с Haskell в ideone.com
- 21. Как извлечь данные из файла в haskell
- 22. Динамические данные как входные данные в функции Haskell
- 23. Написать интерпретатор Haskell в Haskell
- 24. Haskell Servant, передающий пользовательские данные обработчику auth
- 25. Haskell Pipes: Как отсортировать выходные данные производителя?
- 26. Как просмотреть данные из базы данных haskell
- 27. Данные экземпляра. Соответствие с Haskell Aeson
- 28. Haskell - Как создать данные из списка
- 29. Возможности для генерации типов Haskell в Haskell («Haskell второго порядка»)?
- 30. Как создать данные по шаблону Haskell
На странице Википедии, кажется, что ждать-свобода является свойством алгоритма, а не структуры данных. –
@ Daniel: Возможно, это неправильное использование термина. Я имею в виду, что, обертывая все ваши данные в 'TVar', любой алгоритм блокируется. Я хотел бы знать, существует ли тип данных, который делает любой алгоритм без ожидания. – Clinton