0

いくつかの「ブロック」で構成されるデータ構造があります。ブロックごとにミューテックスがあります。データ構造全体をロックし、このロックを呼び出し元の関数に移動するメソッドを実装したいと考えています。これが私のコードです:

std::vector<std::unique_lock<boost::shared_mutex>> lock_array() 
{
    std::vector<std::unique_lock<boost::shared_mutex>> locks;
    for(size_t block = 0; block < BLOCK_COUNT; ++block)
    {
        locks.push_back(std::unique_lock<boost::shared_mutex>(mutexes[block]));
    }
    return std::move(locks);
}

そのような方法で呼び出した場合、アレイは引き続きロックされますか?

void some_method()
{
    auto locks = lock_array();
    ...
}
4

2 に答える 2

3

はい。a を移動するunique_lockとロックが保持され、ベクトルを移動してもロックにはまったく影響しません。これを確認できます:

void some_method()
{
    auto locks = lock_array();
    for (auto const & lock : locks) {
        assert(lock.owns_lock());
    }
}

std::moveまた、戻るときは必要ないことに注意してください。とにかく戻り値は移動されます (移動が省略されない限り)。

于 2013-07-23T10:09:04.313 に答える