@@ -183,6 +183,8 @@ namespace sio
183183 std::queue<packet> m_packet_queue;
184184
185185 std::mutex m_event_mutex;
186+
187+ std::mutex m_packet_mutex;
186188
187189 friend class socket ;
188190 };
@@ -306,9 +308,18 @@ namespace sio
306308 {
307309 m_connected = true ;
308310 m_client->on_socket_opened (m_nsp);
309- while (!m_packet_queue.empty ()) {
310- m_client->send (m_packet_queue.front ());
311+
312+ while (true ) {
313+ m_packet_mutex.lock ();
314+ if (m_packet_queue.empty ())
315+ {
316+ m_packet_mutex.unlock ();
317+ return ;
318+ }
319+ sio::packet front_pack = std::move (m_packet_queue.front ());
311320 m_packet_queue.pop ();
321+ m_packet_mutex.unlock ();
322+ m_client->send (front_pack);
312323 }
313324 }
314325 }
@@ -325,9 +336,12 @@ namespace sio
325336 m_connection_timer.reset ();
326337 }
327338 m_connected = false ;
328- while (!m_packet_queue.empty ()) {
329- m_packet_queue.pop ();
330- }
339+ {
340+ std::lock_guard<std::mutex> guard (m_packet_mutex);
341+ while (!m_packet_queue.empty ()) {
342+ m_packet_queue.pop ();
343+ }
344+ }
331345 client->on_socket_closed (m_nsp);
332346 client->remove_socket (m_nsp);
333347 }
@@ -343,6 +357,7 @@ namespace sio
343357 if (m_connected)
344358 {
345359 m_connected = false ;
360+ std::lock_guard<std::mutex> guard (m_packet_mutex);
346361 while (!m_packet_queue.empty ()) {
347362 m_packet_queue.pop ();
348363 }
@@ -479,14 +494,23 @@ namespace sio
479494 NULL_GUARD (m_client);
480495 if (m_connected)
481496 {
482- while (!m_packet_queue.empty ()) {
483- m_client->send (m_packet_queue.front ());
497+ while (true ) {
498+ m_packet_mutex.lock ();
499+ if (m_packet_queue.empty ())
500+ {
501+ m_packet_mutex.unlock ();
502+ break ;
503+ }
504+ sio::packet front_pack = std::move (m_packet_queue.front ());
484505 m_packet_queue.pop ();
506+ m_packet_mutex.unlock ();
507+ m_client->send (front_pack);
485508 }
486509 m_client->send (p);
487510 }
488511 else
489512 {
513+ std::lock_guard<std::mutex> guard (m_packet_mutex);
490514 m_packet_queue.push (p);
491515 }
492516 }
0 commit comments