相关疑难解决方法(0)

C++中的范围和返回值

我将重新开始使用c ++并考虑变量的范围.如果我在函数内部有一个变量然后我返回该变量,那么当它返回时变量不会"死",因为它所在的范围已经结束了?

我用函数返回一个字符串尝试了这个,它确实有效.有谁能解释一下?或者至少指出一些可以向我解释的地方.

谢谢

c++ scope return-value

25
推荐指数
2
解决办法
2万
查看次数

在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上),所以如果锁在释放之前释放了复制到结果制作,副本可能会被破坏.

我不确定我是否正在解释这个问题,所以我会试着澄清这是否有意义.

c++ multithreading

16
推荐指数
1
解决办法
1796
查看次数

如何std :: mutex :: lock直到函数返回

我想回来一个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)

锁是否仍然是强制性的?为什么?

c++ concurrency thread-safety

10
推荐指数
2
解决办法
5122
查看次数

是否在lock_guard析构函数之前或之后执行了复制返回操作?

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上有类似的问题,但我找不到明确回答这个问题的问题.

c++ destructor thread-safety race-condition stdmutex

9
推荐指数
1
解决办法
186
查看次数