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 的析构函数,解锁互斥量。