3

重複の可能性:
保護されたデータを返すときに lock_guard を使用する方法

次の小さなクラスを想定します。

#include <boost/thread.hpp>
#include <vector>

class ThreadSafeIntCollection {
public:
    void add(int value) {
        boost::mutex::scoped_lock lock(mMutex);
        mVector.push_back(value);
    }

    std::vector<int> getValues() const {
        boost::mutex::scoped_lock lock(mMutex);
        return mVector;
    }
private:
    mutable boost::mutex mMutex;
    std::vector<int> mVector;
};

C++ 標準は、ベクトルのコピー後に変数lockinが破棄されることを保証していますか? getValues()そうしないと、この構造はスレッド化されたコードでは安全ではなくなります。

g++ 4.4 を使用して実験したところ、次のテスト プログラムが期待どおりの結果をもたらすことがわかりました。

#include <iostream>

struct Collection {
    Collection() {}
    Collection(const Collection & /*other*/) {
        std::cout << "Copied collection via copy constructor\n";
    }
    Collection operator=(const Collection & /*other*/) {
        std::cout << "Copied collection via operator=\n";
        return Collection();
    }
};

struct Lock {
    ~Lock() {
        std::cout << "Destroyed lock\n";
    }
};

class SynchronizedClass {
public:
    Collection getElements() {
        Lock l;
        return c;
    }

private:
    Collection c;
};

int main( int /*argc*/, const char* /*argv*/[] ) {
    SynchronizedClass s;
    Collection c = s.getElements();
    return 0;
}

出力:

Copied collection via copy constructor
Destroyed lock

この動作は C++ 標準によって保証されていますか、それとも単に g++ の動作ですか? 標準からの関連する引用は素晴らしいでしょう。

4

0 に答える 0