Библиотека boost::signals2 изнутри
От: Григорьев Вячеслав Владимирович Россия armag.newmail.ru
Дата: 06.09.10 13:55
Оценка: 160 (6)
Статья:
Библиотека boost::signals2 изнутри
Автор(ы): Григорьев Вячеслав Владимирович
Дата: 06.09.2010
В статье описывается внутреннее строение boost-библиотеки signals2. Описываются архитектурные решения, применённые в ней. Приводятся сигнатуры классов, их назначение. Объясняется взаимодействие различных компонентов при выполнении вызовов пользователя.


Авторы:
Григорьев Вячеслав Владимирович

Аннотация:
В статье описывается внутреннее строение boost-библиотеки signals2. Описываются архитектурные решения, применённые в ней. Приводятся сигнатуры классов, их назначение. Объясняется взаимодействие различных компонентов при выполнении вызовов пользователя.
Re: Библиотека boost::signals2 изнутри
От: Аноним  
Дата: 06.09.10 15:02
Оценка:
Зачем нужна boost::signals2, если есть boost::signals?

Здравствуйте, Григорьев Вячеслав Владимирович, Вы писали:

ГВВ>Статья:

ГВВ>Библиотека boost::signals2 изнутри
Автор(ы): Григорьев Вячеслав Владимирович
Дата: 06.09.2010
В статье описывается внутреннее строение boost-библиотеки signals2. Описываются архитектурные решения, применённые в ней. Приводятся сигнатуры классов, их назначение. Объясняется взаимодействие различных компонентов при выполнении вызовов пользователя.


ГВВ>Авторы:

ГВВ> Григорьев Вячеслав Владимирович

ГВВ>Аннотация:

ГВВ>В статье описывается внутреннее строение boost-библиотеки signals2. Описываются архитектурные решения, применённые в ней. Приводятся сигнатуры классов, их назначение. Объясняется взаимодействие различных компонентов при выполнении вызовов пользователя.
Re[2]: Библиотека boost::signals2 изнутри
От: nen777w  
Дата: 06.09.10 16:00
Оценка: +2 :)
Здравствуйте, Аноним, Вы писали:

А>Зачем нужна boost::signals2, если есть boost::signals?

ну... им траву как раз подвезли и просто делать было нефиг...

А если подойти серьезно и почитать на boost.org ?

Signals
Managed signals & slots callback implementation.

Signals2
Managed signals & slots callback implementation (thread-safe version 2).

Re: Библиотека boost::signals2 изнутри
От: Cyberax Марс  
Дата: 10.09.10 21:27
Оценка:
Здравствуйте, Григорьев Вячеслав Владимирович, Вы писали:

4. Метод connection_body::connected зачем-то для проверки состояния отслеживаемых объектов использует тяжеловесный nolock_grap_tracked_objects, получая сильные ссылки, которые всё равно нигде не используются. Почему было просто не воспользоваться методом nolock_slot_expired()?

Для избежания race condition'ов?

Зачем нужно было переусложнять классы arg и набор preprocessed_arg_type[N] с помощью препроцессорного программирования, когда та же задача получения типа из списка типов в библиотеке Loki решается с помощью рекурсивного инстанциирования шаблона. См. в качестве примера метафункцию TypeAt в файле typelist.h библиотеки Loki.

Существенно меньше тормозит компиляция. Помню, что об этом был флейм в списке рассылки.
Sapienti sat!
Re[2]: Библиотека boost::signals2 изнутри
От: SGHouse Россия armag.newmail.ru
Дата: 11.09.10 13:00
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Григорьев Вячеслав Владимирович, Вы писали:


C>

C>4. Метод connection_body::connected зачем-то для проверки состояния отслеживаемых объектов использует тяжеловесный nolock_grap_tracked_objects, получая сильные ссылки, которые всё равно нигде не используются. Почему было просто не воспользоваться методом nolock_slot_expired()?

C>Для избежания race condition'ов?

Да как-то не очень похоже. Собственно, race conditions отсекаются на уровне самого метода connection_body::connected — там locker на Mutex'е ставится. А вот дальнейшие действия по выяснению, нет ли expired-слотов, в обоих вариантах проверялись бы одинаково. nolock_grab_tracked_objects шагает по массиву slot.tracked_objects(), который есть просто std::vector<boost::weak_ptr<void> >. И пытается, применяя метод lock() на каждой слабой ссылке, найти хотя-бы одну, которая никуда не ведёт. Второй метод, nolock_slot_expired(), вызывая slot.expired() (что ведёт к slot_base::expired(), slot_base.hpp, line 63), делает в конечном итоге тоже самое. Только оптимальнее по двум причинам:
а) вызывая метод expired() на слабой ссылке он не создаёт ненужного объекта сильной ссылки, как это делает первый метод, nolock_grap_tracked_objects;
б) первый метод, к тому же, выполняет ненужные в данном контексте операции вставки через фиктивный итератор вставки (connection.hpp; line 123).


C>

C>Зачем нужно было переусложнять классы arg и набор preprocessed_arg_type[N] с помощью препроцессорного программирования, когда та же задача получения типа из списка типов в библиотеке Loki решается с помощью рекурсивного инстанциирования шаблона. См. в качестве примера метафункцию TypeAt в файле typelist.h библиотеки Loki.

C>Существенно меньше тормозит компиляция. Помню, что об этом был флейм в списке рассылки.

Очень интересно. А можно ссылочку глянуть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.