【发布时间】:2014-01-22 10:54:59
【问题描述】:
我有一个线程通过这样的公共接口持续收集数据项:
class MyThread {
public:
class Item {
// ...
};
startup();
shutdown();
bool hasItems() const;
// retrieve collected items
std::vector<Item>&& items();
private:
std::mutex itemMutex;
std::vector<Item> currentItems;
};
检索项目还应清除线程的项目列表。我返回一个右值,以便在调用方调用移动构造函数。当然,检索项目应该是线程安全的,因此实现如下所示:
std::vector<MyThread::Item>&& MyThread::items() {
std::lock_guard<std::mutex> lock(itemMutex);
return std::move(currentItems);
}
我认为这里的锁被释放得太早了:该函数返回右值向量,但是当std::lock_guard 被销毁并释放互斥锁时,不一定会使用它调用移动构造函数。所以据我了解,这不是线程安全的。我对吗?我怎样才能使它成为线程安全的?
【问题讨论】:
-
如果你改变你的函数来返回一个
std::vector<MyThread::Item>而不是一个右值引用那么没有问题。
标签: c++ multithreading c++11 move-semantics