boost scoped_lock是否可以保护复制返回值?

时间:2012-10-23 07:31:03

标签: c++ boost-thread

  

可能重复:
  How to use lock_guard when returning protected data

假设以下小班:

#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 ++行为?标准的相关引用会很棒。

0 个答案:

没有答案