-2

假设我有以下内容:

// ... 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

4

1 回答 1

0

回答我自己的问题——是的,这就是 RAII 的工作原理。for向量在循环体内声明;每次迭代都会销毁并重新创建它。continue还会导致循环其余部分的执行被短路。

当向量被破坏时,它包含的每个对象也被破坏。因此,unique_lock会调用 的析构函数来解锁互斥锁。

于 2022-03-05T01:05:40.197 回答