workspace icon indicating copy to clipboard operation
workspace copied to clipboard

伪唤醒可能导致资源浪费

Open HandsomeGiao opened this issue 1 year ago • 2 comments

if (is_waiting) {
				std::unique_lock<std::mutex> locker(lok);
				task_done_workers++;
				task_done_cv.notify_one();
				thread_cv.wait(locker);
}

这是在workbranch.hpp里面的mission函数的一段代码,这段代码最后的 thread_cv.wait(locker) 应该改为 thread_wait(locker,!is_waiting) 吗?否则伪唤醒可能让一个没有任务的线程一直执行yield()函数,导致资源浪费.

HandsomeGiao avatar Oct 24 '24 07:10 HandsomeGiao

确实存在伪唤醒,但是问题在于多一次循环后task_done_workers++导致计数不准。

Lwhyz avatar Oct 24 '24 08:10 Lwhyz

确实存在伪唤醒,但是问题在于多一次循环后task_done_workers++导致计数不准。

这里是不是改成thread_wait(locker,!is_waiting)后,如果主线程连续两次wait_tasks,会导致worker线程还没有执行完第一轮的thread_cv.wait(locker, [this] { return !is_waiting; });,第二次的wait_tasks又把is_waiting改成true,导致第二轮的task_done_workers++没有执行。

Daveshammer avatar Apr 25 '25 05:04 Daveshammer