【发布时间】:2014-12-09 16:43:41
【问题描述】:
我想返回一个std::vector。这个std::vector 可以被其他线程访问(读和写)。如何在函数完成返回后立即解锁我的std::mutex?
例如:
// Value.cpp
std::vector<int> GetValue()
{
std::lock_guard<std::mutex> lock(mutex);
// Do super smart stuff here
// ...
return m_value;
}
// MyThread.cpp
auto vec = myVec.GetValue();
现在如果“在这里做超级聪明的事情”为空怎么办:
// Value.cpp
std::vector<int> GetValue()
{
std::lock_guard<std::mutex> lock(mutex);
return m_value;
}
// MyThread.cpp
auto vec = myVec.GetValue();
那么锁还是强制的吗?为什么?
【问题讨论】:
-
vec的复制构造发生在锁之外。如果其他线程可能正在修改引用的向量,那么您就有了数据竞争。 -
这不起作用,您正在通过引用返回一些内部状态 (
m_value)。 -
@DieterLücking:确实,我在实际添加代码时注意到了这一点^^' 即使 m_value 是一个成员(所以它应该实际工作),按值返回可以解决我的问题(即使我仍然需要使用 lock_guard<:mutex>)。我添加的实际上是一个未解决的问题。谢谢。
-
如果按值返回,一切都很好。见stackoverflow.com/questions/8437763/…
-
@DieterLücking:是的,确实如此。我不记得为什么我首先通过 const 引用返回。谢谢!
标签: c++ concurrency thread-safety