假设以下小班:
#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
中的变量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 ++行为?标准的相关引用会很棒。