Потокобезопасные сигналы в C++

Копляров Дмитрий
Ведущий разработчик в компании General Satellite.

Во многих ситуациях для передачи событий между различными компонентами системы бывает удобно использовать примитив “сигнал” – callback с несколькими получателями.

Распространённые подходы к реализации сигналов (boost, Qt) удобны в однопоточном окружении, но, к сожалению, имеют два недостатка при использовании из нескольких потоков: 1. Нет возможности атомарно подключиться к сигналу и получить текущее состояние объекта. 2. Отключение от сигнала плохо совместимо с идиомой RAII. В результате, “очевидный” код приводит к race condition’ам и обращениям к разрушенным объектам, а “правильный” подразумевает сложные схемы владения (shared_from_this, либо введение функционально избыточных объектов).

В докладе я расскажу об альтернативной реализации сигналов, лишённой этих недостатков, и объясню на примерах её преимущества перед boost::signals2.

Яндекс.Метрика