浏览代码

Refactored ThreadPool::dequeue()

Paul-Louis Ageneau 4 年之前
父节点
当前提交
06faefd1d6
共有 1 个文件被更改,包括 13 次插入10 次删除
  1. 13 10
      src/threadpool.cpp

+ 13 - 10
src/threadpool.cpp

@@ -66,24 +66,27 @@ bool ThreadPool::runOne() {
 
 
 std::function<void()> ThreadPool::dequeue() {
 std::function<void()> ThreadPool::dequeue() {
 	std::unique_lock lock(mMutex);
 	std::unique_lock lock(mMutex);
-	while(!mJoining) {
-		if(!mTasks.empty()) {
+	while (true) {
+		if (!mTasks.empty()) {
 			clock::time_point time = mTasks.begin()->first;
 			clock::time_point time = mTasks.begin()->first;
-			if(time <= clock::now())
+			if (time <= clock::now()) {
+				auto task = std::move(mTasks.begin()->second);
+				mTasks.erase(mTasks.begin());
+				return task;
+			}
+
+			if (mJoining)
 				break;
 				break;
 
 
 			mCondition.wait_until(lock, time);
 			mCondition.wait_until(lock, time);
-
 		} else {
 		} else {
+			if (mJoining)
+				break;
+
 			mCondition.wait(lock);
 			mCondition.wait(lock);
 		}
 		}
 	}
 	}
-	if (mTasks.empty())
-		return nullptr;
-
-	auto task = std::move(mTasks.begin()->second);
-	mTasks.erase(mTasks.begin());
-	return task;
+	return nullptr;
 }
 }
 
 
 } // namespace rtc
 } // namespace rtc