@@ -1695,11 +1695,6 @@ struct server_response {
16951695 // This function blocks the thread until there is a response for one of the id_tasks
16961696 server_task_result_ptr recv (const std::unordered_set<int > & id_tasks) {
16971697 while (true ) {
1698- std::unique_lock<std::mutex> lock (mutex_results);
1699- condition_results.wait (lock, [&]{
1700- return queue_results.cbegin () != queue_results.cend ();
1701- });
1702-
17031698 for (const auto & id_task : id_tasks) {
17041699 auto iter = queue_results.find (id_task);
17051700 if (iter != queue_results.cend ()) {
@@ -1708,6 +1703,11 @@ struct server_response {
17081703 return res;
17091704 }
17101705 }
1706+
1707+ std::unique_lock<std::mutex> lock (mutex_results);
1708+ condition_results.wait (lock, [&]{
1709+ return queue_results.cbegin () != queue_results.cend ();
1710+ });
17111711 }
17121712
17131713 // should never reach here
@@ -1739,17 +1739,17 @@ struct server_response {
17391739 // single-task version of recv()
17401740 server_task_result_ptr recv (int id_task) {
17411741 while (true ) {
1742- std::unique_lock<std::mutex> lock (mutex_results);
1743- condition_results.wait (lock, [&]{
1744- return queue_results.cbegin () != queue_results.cend ();
1745- });
1746-
17471742 auto iter = queue_results.find (id_task);
17481743 if (iter != queue_results.cend ()) {
17491744 server_task_result_ptr res = iter->second ;
17501745 queue_results.erase (id_task);
17511746 return res;
17521747 }
1748+
1749+ std::unique_lock<std::mutex> lock (mutex_results);
1750+ condition_results.wait (lock, [&]{
1751+ return queue_results.cbegin () != queue_results.cend ();
1752+ });
17531753 }
17541754 }
17551755
0 commit comments