Менеджер событий с использованием сигналов и потоков - PullRequest
0 голосов
/ 07 ноября 2011

Я хотел бы знать, каков наилучший способ построения многопоточной системы событий с использованием Boost :: signal2 и Boost :: thread.

В моем проекте у меня есть сетевой класс, который прослушивает входящее соединение в потоке. Когда игрок подключается, класс должен иметь возможность вызывать событие для класса моего сервера и других функций, слушающих сигнал. Дело в том, что сервер и другие функции также могут быть в потоках, и вызываемая функция НЕ ДОЛЖНА находиться в контексте сетевого класса, а должна находиться в контексте, который подписан на событие.

Каков наилучший способ сделать это? Я слышал об опросе, но я не уверен, как это можно использовать здесь, используя потоки и сигналы.

tldr: уметь прослушивать сигналы других потоков.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Поскольку вы в любом случае пишете сетевой код, рассматривали ли вы boost asio ?

Вкратце, вызов boost :: asio :: io_service :: run из нескольких потоков позволяет вам обрабатывать события многопоточным способом.Кроме того, вы можете опубликовать работу в io_service с помощью io_service :: post, что приведет к выполнению работы io_service в потоках, которые заблокированы в методе run.Для получения дополнительной информации, прочитайте это ТАК сообщение .Ссылка на игру-разработчик дает хорошее представление об asio и о том, как ее можно использовать.Asio также предоставляет метод опроса и многое другое.

Мне кажется, что asio отлично подходит для того, чего вы пытаетесь достичь.

2 голосов
/ 07 ноября 2011

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

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

Существует ли требование, что вы должны использовать сигналы как часть вашего решения?

...