Сигналы Safe Cross Thread / Слот C ++ - PullRequest
2 голосов
/ 03 мая 2010

Кажется, что единственной реализацией, которая обеспечивает безопасные перекрестные потоки для класса сигналов и того, что вызывается в слоте, является QT. (Может я не прав?).

Но я не могу использовать QT в проекте, который я делаю. Итак, как я могу обеспечить безопасный вызов Слотов из другого потока (например, используя Boost :: signal2)? Являются ли мьютекс внутри слота единственным способом? Я думаю, что сигналы2 защищают себя, но не то, что делается внутри слота.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Вы можете комбинировать boost :: bind и boost ASIO для создания перекрестных вызовов.

# In Thread 2
boost::asio::io_service service;
boost::asio::io_service::work work (service); // so io service won't stop if there is no work 
service.run() # starting work thread

# In Thread 1
service.post (boost::bind (&YourClass::function, &yourClassInstance, parameter1, parameter2))

Поток 2 войдет в цикл и выполнит вашу связанную функцию. Я думаю, что вы также можете вызвать вызовы Boost :: Signals2 в этот цикл.

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

Мне не очень нравится Boost :: Signals2 из-за очень долгой трассировки стека и времени компиляции ( сообщение в блоге ).

0 голосов
/ 03 мая 2010

Это не реализация сигналов-слотов, в точности, но есть реализация на C ++ шаблона Twisted Deferred, которая выполняет ту же задачу, что и механизм сигналов-слотов между потоками. Если кто-то не придет и не опубликует лучшее решение, возможно, стоит посмотреть: http://sourceforge.net/projects/deferred/

...