我将重新开始使用c ++并考虑变量的范围.如果我在函数内部有一个变量然后我返回该变量,那么当它返回时变量不会"死",因为它所在的范围已经结束了?
我用函数返回一个字符串尝试了这个,它确实有效.有谁能解释一下?或者至少指出一些可以向我解释的地方.
谢谢
我想在某个地方有一个答案,但我找不到它,因为有很多线程问题,相比之下,我的相当简单.
我不是要创建线程安全的副本或赋值构造函数或类似的东西.
我想知道的是,如果我有一个表示互斥锁的类,并且我从一个实例化它的函数返回,这首先发生,我的互斥体的析构函数(因此解锁它)或返回值的复制构造函数.这是我的例子:
string blah::get_data(void)
{
MutexLock ml(shared_somewhere_else); // so this locks two threads from calling get_data at the same time
string x = "return data";
return x;
}
Run Code Online (Sandbox Code Playgroud)
在其他地方,我们称之为get_data ...
string result = get_data();
Run Code Online (Sandbox Code Playgroud)
回想一下C,我们永远不会返回指向全局变量的指针,因为返回后局部变量超出了范围.
C++没有这个问题,因为x会被复制到结果中.我想知道的是什么时候发生.在复制之前我的锁是免费的吗?
在这个简单的例子中,"返回数据"是静态信息,但我正在使用它,它的数据可以由另一个线程更改(也锁定在同一个MutexLock上),所以如果锁在释放之前释放了复制到结果制作,副本可能会被破坏.
我不确定我是否正在解释这个问题,所以我会试着澄清这是否有意义.
我想回来一个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();
Run Code Online (Sandbox Code Playgroud)
现在如果"在这里做超级聪明的东西"是空的:
// Value.cpp
std::vector<int> GetValue()
{
std::lock_guard<std::mutex> lock(mutex);
return m_value;
}
// MyThread.cpp
auto vec = myVec.GetValue();
Run Code Online (Sandbox Code Playgroud)
锁是否仍然是强制性的?为什么?
是get_a()功能安全的比赛条件或者我需要明确地复制str_在get_b()为了有一个线程安全的功能?
class Class {
public:
auto get_a() -> std::string {
auto&& guard = std::lock_guard{mutex_};
return str_;
}
auto get_b() -> std::string {
auto&& guard = std::lock_guard{mutex_};
auto str = str_;
return str;
}
private:
std::mutex mutex_{};
std::string str_{};
};
Run Code Online (Sandbox Code Playgroud)
注意:我知道Stack Overflow上有类似的问题,但我找不到明确回答这个问题的问题.