Вам нужно будет поделиться некоторым состоянием между двумя, которые могут быть использованы для передачи этого.
В качестве следствия, если обратный вызов не имеет состояния, это нельзя сделать (или только в рамках определенных ограничений, таких как ограничение количества обратных вызовов, которые могут быть активными одновременно).
Поскольку доступ к этому общему состоянию потенциально происходит одновременно из разных потоков, весь доступ должен быть синхронизирован, т.е. сделано потокобезопасным.
Вот простой пример использования 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
хранилище, с обычным результирующие ограничения.