Блокировка асинхронной функции C++

Рейтинг: 0Ответов: 1Опубликовано: 25.08.2023

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

Ответы

▲ -1

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

void OnWrite() {
    // Данные записались в сокет
    
    std::thread t(SendNextRequest);
    t.detach();
}