Что является хорошим способом для выполнения межплатформенных межпоточных уведомлений в C ++? - PullRequest
1 голос
/ 15 сентября 2011

Сценарий: - Мой основной поток (UI) (поток «M») запускается и раскручивает рабочий поток («W») для управления некоторым оборудованием.- "W" хочет отправлять уведомления о прогрессе на "M" очень часто.- Уведомление-вызов не может блокировать «W» ... «W» необходимо совершить вызов и немедленно вернуться;«M» обработает уведомление асинхронно и ничего не вернет «W».- «M» должен быть уведомлен обратным вызовом, запущенным в потоке «M».- Должен иметь возможность передавать данные (не беспокойтесь о поточной безопасности данных).

.NET имеет именно такую ​​возможность в своем классе System.ComponentModel.AsyncOperation, но я хочу создать кросс-платформенный код, а не только .NET или даже строго Win32 (хотя моя 1-я платформа является родной c ++ для Win32).

Использование Boost было бы плюсом.

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

Любые идеи и / или ссылки будут высоко оценены!-Dave

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Если вы используете Boost.Thread , тогда вы можете использовать условную переменную .

0 голосов
/ 15 сентября 2011

Вот как бы я это сделал:

  • Вам необходимо настроить список сообщений, который может быть реализован, например, как связанный список. Доступ к этому списку всегда должен быть защищен мьютексом.
  • Когда «W» хочет отправить обновление в «M», оно просто добавляет новые данные в конец списка сообщений.
  • После добавления в список сообщений "W" может сигнализировать "M", что имеются новые данные, например, с использованием семафора.
  • «M» может выполнять любые задачи, которые ему нужно выполнять, и каждый раз может проверять состояние семафора. Если семафор находится в сигнальном состоянии, он может сбросить его и использовать сообщения из списка.

Редактировать : обратите внимание, что требование использовать мьютекс необязательно. Это было бы наиболее распространенным, наиболее кроссплатформенным дружественным решением, и поэтому я привел его в своем примере. Если требование для потока «W» никогда не блокировать является самым сильным требованием, то вы можете заменить список + мьютекс структурой данных без блокировки, если она у вас есть для вашей платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...