C ++ ожидает завершения обратного вызова в обратном вызове - PullRequest
0 голосов
/ 29 октября 2018

У нас есть код, который регистрирует обратный вызов. Таким образом, поток, который регистрирует обратный вызов, не знает, когда будет вызываться обратный вызов.

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

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

1 Ответ

0 голосов
/ 29 октября 2018

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

В качестве следствия, если обратный вызов не имеет состояния, это нельзя сделать (или только в рамках определенных ограничений, таких как ограничение количества обратных вызовов, которые могут быть активными одновременно).

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

Вот простой пример использования std::future:

#include <future>
// [...]

std::promise<void> p;
do_work_async([&p]() { p.set_value(); });

std::future<void> f = p.get_future();
f.get();  // this line will block until the callback is executed

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

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

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