Блокировка асинхронной функции C++
Всем привет! Помогите разобраться, как правильно сделать вот такую штуку на C++.
У меня есть класс, который реализует веб-сокет клиент. Пользователь может из нескольких потоков вызывать метод отправки сообщений Send(). Этот метод кладет сообщение в очередь на отправку и вызывает SendNextRequest(), который извлекает первое сообщение из очереди и пишет его в сокет:
void SendNextRequest() {
// (1)
// Возьмем сообщение из очереди и асинхронно запишем данные в сокет
ws_->async_write(OnWrite);
}
Функция отправки сообщения SendNextRequest вызывает бустовую функцию async_write, которая пишет данные в сокет и как только они записались, то будет вызван метод OnWrite
void OnWrite() {
// Данные записались в сокет
// Вот тут надо бы опять вызвать SendNextRequest()
SendNextRequest();
// (2)
}
Мне бы хотелось, чтобы по окончанию работы OnWrite я мог опять вызвать SendNextRequest, чтобы отправить следующее сообщение из очереди, и так пока очередь не опустеет. Загвоздка тут в том, что изначально Send() вызывается из разных потоков, соответственно SendNextRequest тоже будет работать в разных потоках. Каким образом я могу заблокировать SendNextRequest с начала ее выполнения (1) и до окончания выполнения OnWrite (2), чтобы все остальные потоки ждали своей очереди?