workspace
workspace copied to clipboard
伪唤醒可能导致资源浪费
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()函数,导致资源浪费.
确实存在伪唤醒,但是问题在于多一次循环后task_done_workers++导致计数不准。
确实存在伪唤醒,但是问题在于多一次循环后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++没有执行。