Я предваряю это, сказав, что я впервые вникаю в многопоточность. Несмотря на то, что вы много читаете о параллелизме и синхронизации, я не всегда вижу решение для требований, которые мне были даны.Как отправить сигнал/данные из рабочего потока в основной поток?
Используя C++ 11 и Boost, я пытаюсь выяснить, как отправлять данные из рабочего потока в основной поток. Рабочий поток генерируется в начале приложения и непрерывно контролирует свободную от блокировки очередь. Объекты заполняют эту очередь различными интервалами. Эта часть работает.
После того, как данные доступны, его необходимо обработать основным потоком, так как другой сигнал будет отправлен в остальную часть приложения, которое не может быть на рабочем потоке. Это то, с чем я столкнулся.
Если мне нужно заблокировать основной поток через мьютекс или переменную условия до тех пор, пока рабочий поток не будет выполнен, как это улучшит отзывчивость? Я мог бы просто остаться с одним потоком, чтобы у меня был доступ к данным. Я должен что-то упустить.
Я написал пару вопросов, считая, что Boost :: Asio - это путь. Существует пример того, как сигналы и данные могут быть отправлены между потоками, а также ответы показывают, вещи быстро получить чрезмерно сложными, и это не работает отлично:
How to connect signal to boost::asio::io_service when posting work on different thread?
Boost::Asio with Main/Workers threads - Can I start event loop before posting work?
После разговора с некоторым коллегам было предложено использовать две очереди - один вход, один выход. Это будет в общем пространстве, и очередь вывода будет заполнена рабочим потоком. Рабочий поток всегда идет, но должен быть таймер, возможно, на уровне приложения, который заставит основной поток исследовать очередь вывода, чтобы увидеть, есть ли какие-либо ожидающие решения задачи.
Любые идеи о том, куда я должен обратить свое внимание? Существуют ли какие-либо методы или стратегии, которые могут работать для того, что я пытаюсь сделать? Я буду смотреть на Таймеров.
Спасибо.
Редактировать: Это производственный код для плагиновой системы, которая обрабатывает результаты моделирования после обработки. Сначала мы используем C++ 11, а затем Boost. Мы используем стопку без блокировки ::. Приложение делает то, что мы хотим, в одном потоке, но теперь мы пытаемся оптимизировать, где мы видим, что есть проблемы с производительностью (в данном случае расчет происходит через другую библиотеку). Основной поток имеет много обязанностей, включая доступ к базе данных, поэтому я хочу ограничить то, что на самом деле делает рабочий поток.
Update: Я уже успешно опробовал зЬй :: нитки, чтобы запустить рабочий поток, который изучает замок Повысьте :: бесплатно очередь и обрабатывает задачи поставили ее в это шаг 5 в @ Pressacco в ответ, что я». m есть проблема. Любые примеры, возвращающие значение в основной поток, когда рабочий поток завершается и информирует основной поток, а не просто ждет завершения работника?
Что еще является основной темой? – Yakk