#include <vector>
#include <string>
#include <mutex>
#include <future>
using namespace std;
mutex g_mtx;
vector<string> g_coll;
void Cleaner()
{
lock_guard<mutex> lock(g_mtx);
g_coll.clear();
}
const vector<string>& Getter()
{
lock_guard<mutex> lock(g_mtx);
return g_coll;
}
int main()
{
g_coll = { "hello" };
auto fut = async([&]()
{
Cleaner();
});
auto returned_coll = Getter();
fut.get();
}
如果在Cleaner
之后执行return g_coll;
,那么returned_coll
包含{ "hello" }
的C ++标准保证是什么?
答案 0 :(得分:5)
不,这不安全。
从语义上讲,非void返回类型函数返回时的事件顺序如下:
请注意,returned_coll
不是返回值。相反,Getter()
是返回值。从returned_coll
返回的左值初始化Getter()
发生在步骤4之后。
因此,当returned_coll
从Getter()
复制初始化时,Getter
所持有的互斥锁已经被释放,这意味着returned_coll
的初始化可能会与Cleaner
中的访问权限。