Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Barriers

Boost , Chapter 1. Fiber , Synchronization

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Барьер - это концепция, также известная какрандеву, это точка синхронизации между несколькими контекстами выполнения (волокнами). Барьер сконфигурирован для определенного количества волокон (n), и по мере того, как волокна достигают барьера, они должны ждать, пока всеnволокна не достигнут. Как толькоn— волокно достигло барьера, все ожидающие волокна могут продолжиться, и барьер сбрасывается.

Существенным является тот факт, что барьер автоматически сбрасывается. Рассмотрим случай, в котором вы запускаете некоторое количество волокон и хотите подождать, пока первый из них не будет завершен. У вас может возникнуть соблазн использоватьбарьер2в качестве механизма синхронизации, заставляя каждое новое волокно вызывать свойбарьер:: ждитеметод, а затем вызыватьждатьв пусковом волокне, чтобы ждать, пока первое другое волокно не завершится.

Это фактически разблокирует пусковое волокно. Недостатком является то, что он будет продолжать блокироватьоставшиесяволокна.

Рассмотрим следующий сценарий:

  1. Волокони #8220;основнойи #8221;запускает волокна A, B, C и D, затем вызываетбарьер::ждите().
  2. Волокно C заканчивается первым и также вызываетбарьер::ждать[].
  3. Волокнои #8220;основноеи #8221;разблокировано, по желанию.
  4. Волокно B вызываетбарьер::ждите. Волокно Bзаблокировано!
  5. Волокно А вызываетбарьер::ждите(). Волокна A и B разблокированы.
  6. Волокно D вызываетбарьер::ждать. Волокно D блокируется на неопределенный срок.

(См. также, когда_любое, простое завершение.)

[Note] Note

Неразумно связывать продолжительность жизни барьера с любым из его участвующих волокон. Хотя концептуально все ожидающие волокна пробуждаютсяи #8220;одновременно,и #8221;из-за природы волокон, на практике они пробуждаются один за другим в неопределенном порядке.Остальные ожидающие волокна все равно будут заблокированы вожидании(), которые должны, прежде чем вернуться, получить доступ к элементам данных в барьерном объекте.

Class barrier

#include <boost/fiber/barrier.hpp>
namespace boost {
namespace fibers {
class barrier {
public:
    explicit barrier( std::size_t);
    barrier( barrier const&) = delete;
    barrier & operator=( barrier const&) = delete;
    bool wait();
};
}}

Случаибарьеране являются копируемыми или подвижными.

Constructor
explicit barrier( std::size_t initial);

Effects:

Постройте барьер дляисходныхволокон.

Throws:

волокно_ошибка

Error Conditions:

недействительный_аргумент: еслиначальныйравен нулю.

Member function wait()

bool wait();

Effects:

Блок доначальныхволокон вызваложиданиена*это. Когданачальное-th волокно вызываетожидание, все ожидающие волокна разблокированы, и барьер сбрасывается.

Returns:

истиннодля ровно одного волокна из каждой партии ожидающих волокон,ложнов противном случае.

Throws:

волокно_ошибка



Текущая реализация будит волокна в порядке FIFO: первый вызовждать()просыпается первым и так далее. Но опасно полагаться на порядок, в котором различные волокна достигнутожиданиявызова.


PrevUpHomeNext

Статья Barriers раздела Chapter 1. Fiber Synchronization может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Synchronization ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 09:59:11/0.0068089962005615/0