@@ -1695,6 +1695,11 @@ 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+
16981703 for (const auto & id_task : id_tasks) {
16991704 auto iter = queue_results.find (id_task);
17001705 if (iter != queue_results.cend ()) {
@@ -1703,11 +1708,6 @@ struct server_response {
17031708 return res;
17041709 }
17051710 }
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+
17421747 auto iter = queue_results.find (id_task);
17431748 if (iter != queue_results.cend ()) {
17441749 server_task_result_ptr res = iter->second ;
17451750 queue_results.erase (id_task);
17461751 return res;
17471752 }
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