次の小さなクラスを想定します。
#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++ 標準は、ベクトルのコピー後に変数lock
inが破棄されることを保証していますか? 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++ の動作ですか? 標準からの関連する引用は素晴らしいでしょう。