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

В чем причина, почему абстракции высокого уровня, которые используют программирование без блокировки, недостаточно популярны?

Из того, что я собрал в свободном программировании, это невероятно сложно сделать правильно... и я согласен. Просто думать о некоторых проблемах делает мою голову больно. Но я удивляюсь, почему широко распространено использование оберток высокого уровня вокруг (например, блокировка свободной очереди и аналогичных материалов)? Например, у boost нет библиотеки, свободной от блокировки, хотя, как я знаю, это было предложено. Я имею в виду, я предполагаю, что есть много приложений, где вы не можете избежать того факта, что критический раздел - большая часть нагрузки. Итак, в чем причины? Это...

  • Патенты - я слышал, что некоторые вещи, связанные с незакрепленным программированием, запатентованы.
  • Производительность.
  • Google и Microsoft имеют такие внутренние библиотеки, но ни один из них не является общедоступным...
  • Что-то еще?

Итак, мой вопрос: почему абстракции высокого уровня, которые используют программирование с блокировкой в ​​глубину не очень популярным, в то время как "регулярное" многопоточное программирование "включено"?

EDIT: boost получил незаблокированную lib:)

4b9b3361

Ответ 1

Есть мало людей, которые достаточно знакомы с полем для создания простых в использовании библиотек без блокировки. Из тех немногих, даже меньше публикуемых работ бесплатно, и из тех, кто почти никогда не выполняет жизненно важную дополнительную работу, чтобы сделать библиотеку полезной - например, публиковать полные документы API и т.д. Они, как правило, просто выпускают zip файл с кодом, который почти бесполезен. Тогда, конечно, вам также нужно найти библиотеку, написанную на языке, который вы хотите использовать, компилируется на платформе, которую вы используете, и, наконец, слово библиотеки должно выйти, поэтому люди знают, что она существует.

Патенты - это проблема, поскольку они ограничивают то, что можно предложить. Насколько мне известно, нет непатентованных односвязных списков. Весь список пропусков также сильно запатентован.

Герой в этом поле - Cliff Click, который придумал хеш-ключ без блокировки, который у него более или менее размещен в общедоступном домене.

Здесь вы можете найти мою бесплатную библиотеку;

http://www.liblfds.org

Другим является Samy Bahra Concurrency Kit;

http://www.concurrencykit.org

Ответ 2

FYI. Microsoft.Net framework приобрела некоторые свободные классы в .Net 4.0. А именно классы контейнеров в пространстве имен System.Collections.Concurrent, которые:

ConcurrentDictionary
ConcurrentQueue
ConcurrentStack

Я изучил их реализацию, и они довольно сложно/сложны под капотом, поэтому они представляют собой значительную часть усилий при проектировании и тестировании (проблемы с резьбой, конечно, трудно проверить на высоком уровне).

Ответ 3

Вы можете посмотреть libcds библиотеку С++. Это коллекция блокировочных контейнеров (стеков, очередей, наборов и карт) и безопасных алгоритмов восстановления памяти.

IMHO относительно С++ (я не продвинутый на других языках). Новый стандарт С++ только что был выпущен, и разработчикам компилятора требуется время для выполнения своих требований. Сегодня все компиляторы полностью не поддерживают модель памяти С++ 11, так как она требует значительных изменений в правилах оптимизации компиляторов. В последнее время Microsoft объявляет о поддержке атомных операций, которая является основой программирования без блокировки в VС++ 11 Developer Preview. Это хорошая новость для нас. Как я знаю, GCC будет поддерживать его в 4.8 (или выше).

Вторая проблема - это патенты. Многие интересные блокирующие алгоритмы контейнеров запатентованы, что является препятствием для их включения в библиотеки поставщиков.

В-третьих, основная часть контейнеров без блокировки - сбор мусора (безопасная рекультивация памяти). С++ не содержит каких-либо GC (к счастью). Есть несколько GC algos (указатель опасности, Pass-the-Buck, основанный на эпохе и т.д.), Но большинство из них также запатентовано.

В-четвертых, недостаточно инструментов для доказать правильность ограждений памяти, применяемых в вашей реализации без блокировки. Теперь я знал только один - relacy (http://www.1024cores.net/home/relacy-race-detector).

Я думаю, что через 2-3 года хорошо видят много готовых к выпуску многоплатформенных библиотек С++ для блокировки контейнеров и алгоритмов. Эти библиотеки разрабатываются вендорами и энтузиастами.

Однако, на мой взгляд, наше будущее - это транзакционная память аппаратная (HTM). Сегодня AMD, Sun (извините, Oracle), Intel (?) Исследуют HTM с очень интересными результатами. Подождите.

Ответ 4

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

Самая большая проблема с замками - это не производительность, а надежность. Если поток становится доступным, когда он держит блокировку, система умирает. Напротив, если поток, который обращается к блокированной структуре данных, становится утерянным, это не повлияет на использование других потоков. В некоторых ситуациях структура блокировки без блокировки может быть предпочтительнее одной, использующей блокировки, , даже если производительность ниже, поскольку необходимо защитить систему от сбивания сбойным потоком (например, даже если бы кто-то был готов убить поток, который попал в StackOverflowException, не снимая этот процесс, как бы защитить от потока, помещающего много вещей в его стек, прежде чем вызывать метод доступа к защищенной блокировкой структуре данных, что метод, так что метод блокировки блокирует переполнение стека?) Если вы используете блокирующие данные структуры данных, такие риски не являются проблемой.

Ответ 5

Существует, по крайней мере, одна "свободная от блокировки" структура, которая несколько популярна: Erlang.