最近工作中发现了一个 Bug,就是有一个 condition variable 在临界区内调用了notify_one,让另一个在cv.wait的线程唤醒了一下然后立马又被 blocked 了。虽然不影响逻辑,但是会带来额外的线程切换负担。
公司的大神说: You shouldn't notify_one() while holding the mutex.
虽然问题解决了(通过lock.unlock(); cv.notify_one(); lock.lock();),但是这引起了我好奇,cv.wait是如何告诉调度器本线程不应该被调度的?又是怎样在得到信号后唤醒线程的?
请高人帮忙解答一下吧,谢谢!