RAII:在循环中声明的向量中的互斥量是否在下一次迭代中全部解锁?
RAII: do mutexes in a vector declared in a loop all unlock in the next iteration?
假设我有以下内容:
// ... necessary includes
class X {
struct wrapper{ std::mutex mut{}; }
std::array<wrapper, 20> wrappers{};
void Y()
{
for (auto i{0u}; i < 10; ++i)
{
std::vector<std::unique_lock<std::mutex>> locks_arr{};
for (auto& wrapp : wrappers)
{
locks.emplace_back(std::unique_lock{wrapp.mut});
}
// are the mutexes in locks_arr unlocked here by RAII,
// because locks_arr goes 'out of scope'?
if (/* some condition */) continue;
// do some other long stuff
// end of loop iteration; how about here?
}
}
}
一个简单的问题,在代码本身中进行了说明。 locks_arr
中的互斥锁是否在循环的下一次迭代中解锁,或者是否明确需要在 if
语句块中以及在循环的末尾逐个解锁所有互斥锁外部 for
-loop?
回答我自己的问题——是的,这就是 RAII 的工作原理。向量在 for
循环体内声明;每次迭代都会销毁并重新创建它。 continue
还会导致循环其余部分的执行为 short-circuited.
当向量被销毁时,它包含的每个对象也被销毁。因此,调用 unique_lock
的析构函数,解锁互斥量。
假设我有以下内容:
// ... necessary includes
class X {
struct wrapper{ std::mutex mut{}; }
std::array<wrapper, 20> wrappers{};
void Y()
{
for (auto i{0u}; i < 10; ++i)
{
std::vector<std::unique_lock<std::mutex>> locks_arr{};
for (auto& wrapp : wrappers)
{
locks.emplace_back(std::unique_lock{wrapp.mut});
}
// are the mutexes in locks_arr unlocked here by RAII,
// because locks_arr goes 'out of scope'?
if (/* some condition */) continue;
// do some other long stuff
// end of loop iteration; how about here?
}
}
}
一个简单的问题,在代码本身中进行了说明。 locks_arr
中的互斥锁是否在循环的下一次迭代中解锁,或者是否明确需要在 if
语句块中以及在循环的末尾逐个解锁所有互斥锁外部 for
-loop?
回答我自己的问题——是的,这就是 RAII 的工作原理。向量在 for
循环体内声明;每次迭代都会销毁并重新创建它。 continue
还会导致循环其余部分的执行为 short-circuited.
当向量被销毁时,它包含的每个对象也被销毁。因此,调用 unique_lock
的析构函数,解锁互斥量。