【发布时间】:2017-11-13 12:08:39
【问题描述】:
假设我们有以下(伪)代码:
using UpgradeLock = boost::upgrade_lock<boost::shared_mutex>;
using UpgradeToUniqueLock = boost::upgrade_to_unique_lock<boost::shared_mutex>;
boost::shared_mutex mtx;
void DeleteTable(<tbl>) {
UpgradeLock lock(mtx);
if (<the table exists>) {
UpgradeToUniqueLock up(lock); // (!)
// delete the table
}
}
并且假设两个线程刚刚进入这个函数并且都到达了语句,标记为(!)。
我不知道接下来会发生什么。我有以下选择:
- 在第二个线程释放其
UpgradeLock之前,一个线程无法获得独占访问权限,但在它也获得独占访问权限之前也无法获得。死锁。 - 一个线程获得独占访问权,而另一个线程在标记为
(!)的行处暂停。
我猜第二个选项可能会发生,但在这种情况下,即使环境被锁定,我们也必须重新检查我们的数据没有被“外部”更改,即我们必须使用臭名昭著的DCLP。我说的对吗?
我没有找到任何关于它的合理信息,所以不要责怪我:)
【问题讨论】:
-
@VTT :我认为这是一个答案,而不是评论。
标签: c++ multithreading boost locking double-checked-locking