LINUX.ORG.RU

c++ boosts::signals(2)

 , ,


0

6

Доброго вечера. Прошу у опытных товарищей не большого разъяснения по сабжу. Если мы ловим сигналы в одном потоке все понятно. А если в разных? Грубо говоря, первый поток вызывает сигнал, этот сигнал должен ловиться во втором потоке. Но если у нас во втором потоке крутится бесконечный цикл, то как тогда он отработает этот сигнал?

Очевидно - само по себе ничего не вызовется. Такие вещи делаются через очередь сообщений.

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

// boost знаю не очень, сигналами его не пользовался, но иначе никак в принципе.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

иначе никак в принципе

Не верно. Есть POSIX signals (реализуются ядром ОС). Они подобны прерываниям в процессоре - нить останавливается и вызывается функция-обработчик. После выхода из неё восстанавливается исходное состояние и выполнение нити продолжается как обычно. В обработчиках сигналов нельзя вызывать некоторые функции (например, malloc), которые не являются reentrant.

Использует ли boost данный механизм или всё таки очередь сообщений - я понятия не имею.

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 1)

boost signals это просто std::list<std<function>>.

anonymous ()

В boosts::signals(2) нет никаких сигналов. Там отправка сигнала - это лишь способ спрятать цикл, который вызывает коллбеки. Т.е. все зарегистрированные обработчики сигналов (коллбеки) вызываются и выполняются в том потоке, который отправил сигнал. Это относится к обоим библиотекам сигналов буста (первой и второй).

Чтобы сигналы вызывать в одном потоке, а обрабатывать в другом, нужен цикл обработки событий в каждом потоке, а для этого придется довольно тесно интегрироваться с потоками. В результате, чтобы сделать полноценную библиотеку работы с сигналами в разных потоках, нужно сделать как в Qt. Есть класс потока, в нем есть цикл обработки событий, при создании потока его нужно запустить, а также есть сигналы, которые работают как надо, потому что интегрированы с такими специальными потоками.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.