is boost::lockfree::queue не блокируется с С++ 11?

Я пытаюсь заменить boost::lockfree::queue на std::queue в этом примере websocket++ https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

Похоже, это можно сделать, не меняя синтаксиса, но удаляя boost::unique_lock строки.

Однако, когда я смотрю на пример boost, в нем есть раздел кода, который проверяет наличие блокировки http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

Когда я просматриваю документы на lockfree::queue, там написано это на is_lock_free() http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.html:

bool is_lock_free(void) const;

Предупреждение

Он только проверяет, можно ли модифицировать головной и конечный узлы очереди, а также свободный список без блокировок. На большинстве платформ вся реализация не блокируется, если это правда. Используя атомарность в стиле c++0x, невозможно обеспечить полностью точную реализацию, потому что нужно будет тестировать каждый внутренний узел, что невозможно, если дополнительные узлы будут выделены из операционной системы.

Возвращает: true, если реализация не блокируется.

Я понятия не имею, что такое «атомарность в стиле С++ 0x», но я почти уверен, что С++ 0x означает С++ 11.

Я использую С++ 11 и просто заменяю boost::lockfree::queue на std::queue, так что это не будет реализовано без блокировки?


person Community    schedule 10.03.2013    source источник
comment
Я призываю вас оценить, прежде чем переходить к безблокировочным алгоритмам — они хороши, но спроектированы так, чтобы быть масштабируемыми и безопасными (т. е. предотвращать инверсию приоритета) — производительность вызывает меньше беспокойства и, как правило, хуже. Например, реализация очереди без блокировки в Boost будет медленнее, чем заблокированная std::queue, если только у вас нет нескольких ядер и очень большого количества конфликтов.   -  person Cory Nelson    schedule 10.03.2013
comment
I have no idea what "c++0x-style atomics" are говорит о boost::atomic, который на что опирается библиотека.   -  person Jesse Good    schedule 11.03.2013
comment
+1 за пример библиотеки   -  person ExoticBirdsMerchant    schedule 10.03.2014


Ответы (2)


Нет. Комментарий "нет возможности предоставить полностью точную реализацию" относится к is_lock_free(), т.е. не гарантируется, что is_lock_free() возвращает результат, точно отражающий, свободна ли реализация от блокировок. Однако, если is_lock_free() возвращает true, вполне вероятно, что реализация свободна от блокировок, но не абсолютно, чугун гарантирован.

person Philip Kendall    schedule 10.03.2013
comment
Спасибо! Вы бы сказали, что это безопасно для использования с приведенным выше примером, или я должен ожидать потери сообщений/соединений на регулярной основе? - person ; 10.03.2013
comment
Почему вы ожидаете, что что-то потеряется? - person Cory Nelson; 10.03.2013
comment
@CoryNelson Потому что я совершенно неопытен в С++. is_lock_free звучит так, как будто могут быть ситуации, когда он не свободен от блокировки, поэтому может произойти что-то плохое, например, потеря сообщений/соединений. - person ; 10.03.2013
comment
Я думаю, вы, вероятно, захотите прочитать о том, что такое алгоритм блокировки без блокировки. - person Philip Kendall; 10.03.2013
comment
если is_lock_free равно false, это означает только то, что он будет использовать внутренние блокировки. Алгоритм по-прежнему будет потокобезопасным, просто без дополнительных свойств, для которых люди используют алгоритмы без блокировок. - person Cory Nelson; 10.03.2013
comment
@CoryNelson Пожалуйста, разверните, чтобы ответить на + n chk. - person ; 10.03.2013
comment
Честно говоря, это совсем другой вопрос (в основном, что такое алгоритм без блокировки), в отличие от вашего исходного вопроса о том, является ли конкретный алгоритм в конкретной библиотеке свободным от блокировки. - person Philip Kendall; 11.03.2013
comment
@PhilipKendall Можете ли вы обновить свой ответ, включив в него информацию о Кори? В то время как вы определенно добавили важные знания (и мой голос остается в силе; я не понимаю, кто только что проголосовал за вас), Кори лучше понял первоначальные намерения относительно моего чрезмерного невежества. ржу не могу - person ; 11.03.2013
comment
Честно говоря, я не думаю, что это было бы полезно другим читателям сайта — люди не будут смотреть на конкретный вопрос на boost::lockfree::queue для получения общей информации о том, что такое алгоритм без блокировки. Если вы считаете, что такая информация будет полезна другим читателям сайта, могу ли я предложить вам вместо этого задать другой вопрос? (хотя хорошенько подумайте, на каком сайте SE он должен быть и спрашивали ли его раньше). - person Philip Kendall; 11.03.2013

Я понятия не имею, что такое «атомарность в стиле С++ 0x», но я почти уверен, что С++ 0x означает С++ 11.

  • c++0x относится к стандартам C++03 и/или c++07 C++.
  • c++1x обычно относится к c++11
  • c++1y относится к преемнику c++11.
person unaiur    schedule 02.09.2013
comment
Это совершенно неправильно. И C++0x, и C++1x относятся к c++11. c++1y относится либо к c++14, либо к c++17, но обычно к первому. - person ; 11.09.2013