@HamsterGamer

Можно ли параллельно запускать io_service::run?

Имею довольно большой код, в котором санитайзер выявляет data race. В этом коде я использую мьютексы в каждом методе моего класса с сетевым интерфейсом, который хранит/создает для себя свой сокет, примерно так:
struct NetRequster {
//...
   void some_work_if_recive();  
   void some_work_if_timeout();
// ...
private:
   ba::ip::tcp::socket socket_;
   std::mutex m;
// ...
};

Если данные придут, то вызывается метод some_work_if_recive, который что-то сделает и в дальнейшем вырубит все операции со своим классом с помощью булевого флажка, если данные не придут за определенное время, то вызывается some_work_if_timeout, который вызовет у сокета метод close, и все эти данные всегда будут под мьютексом, параллелить же планируется работу отдельных NetRequster. С другой стороны, создав много таких реквестеров я просто запускаю io_service::run в N потоках.
Однако io_service где-то у себя проверяет открыт ли сокет методом is_open, что в свою очередь не закрывается моим мьютексом и приводит к дата рейсу. Я не думаю что это нормально, но выходит что параллелить так вообще не получится, подскажите что я делаю не так или как оно должно выглядеть на самом деле? Возможно даже есть пример того что я хочу!
Вот что выдает санитайзер:
62160dd4ed5ce396847242.png62160ddb6edd1023118470.png
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы