解锁在通知条件之前获取锁的奥秘
条件变量的使用是多线程环境中同步的一个基本方面。出现的一个常见问题是,在调用condition_variable.notify_one()之前是否有必要获取锁。
在notify_one()之前获取锁
从技术上讲,获取一个调用condition_variable.notify_one() 之前的锁定不是强制性的。然而,在某些场景下,这被认为是一种很好的做法。
锁定的好处
在通知之前锁定可以防止通知和解锁之间的竞争条件。例如,如果通知线程在调用notify_one()后立即释放锁,则被通知线程可能会在通知线程有机会更新共享资源之前获取锁并访问共享资源。为了避免这种竞争情况,建议保持锁定直到共享资源更新后。
何时不锁定
在以下情况下不需要锁定通知线程没有修改共享资源。例如,如果notify_one()调用纯粹是为了唤醒等待线程而不修改数据,那么锁定将是多余的。
Predicate Wait的异常
异常当使用基于谓词的等待调用(例如 cv.wait(lk, []{return i == 1;}) 时),请遵守在 notification_one() 出现之前锁定的一般规则。在这种情况下,在notify_one()之前获取锁是多余的,因为谓词本身确保在等待线程恢复执行之前满足等待条件。
示例分析
在提供的示例中,第一个 notify_one() 调用未锁定,因为通知线程未更新共享资源。然而,后续的notify_one()调用会被锁定,因为它们处于修改共享资源的循环内(i设置为1)。
结论
是否或在condition_variable.notify_one()之前不获取锁取决于具体的同步要求。在大多数情况下,锁定有利于防止数据修改期间的竞争条件。然而,当notify_one()调用只是为了唤醒等待线程而不修改共享资源或使用基于谓词的等待调用时,这是不必要的。
以上是在调用'condition_variable.notify_one()”之前是否应该获取锁?的详细内容。更多信息请关注PHP中文网其他相关文章!