在新线程中访问移动的std :: string

the*_*ang 7 c++ multithreading move c++11 stdthread

考虑下面的情况

名称字符串作为参数移动到线程.

 void start(std::string&& name) {
        t = std::thread{&ThreadRunner::run, this, std::forward<std::string>(name)};
    }
Run Code Online (Sandbox Code Playgroud)

线程的run函数也采用右值引用.

 void run(std::string&& name) {
        const auto errnum = pthread_setname_np(t.native_handle(), name.c_str());
        if (errnum != 0) {
            std::cout << "ERROR " << std::endl;
        }
    }
Run Code Online (Sandbox Code Playgroud)

线程通过start函数创建,如下所示:

  ThreadRunner r;
  r.start(std::string("somename"));
Run Code Online (Sandbox Code Playgroud)

问题是.run通过pthread_setname_np 在函数中访问的std :: string是否可能是垃圾,因为当范围结束时临时超出了范围?

演示 在上面的演示中,在call结束之后,是否保证somename字符串在函数中有效run

编辑: 使用构造函数/析构函数进行演示 问题中的std :: string现在替换为a Wrap来打印所涉及的构造函数.

结果是:(第二个字段是对象的地址,第三个是线程ID)

Constructed 0x7ffc395e0ef0 140605000369984
Move Constructed 0x7ffc395e0e60 140605000369984
Move Constructed 0x177a0a0 140605000369984
Destroyed 0x7ffc395e0e60 140605000369984
Destroyed 0x7ffc395e0ef0 140605000369984
Call ended

somename
Destroyed 0x177a0a0 140604983461632
Run Code Online (Sandbox Code Playgroud)

最后一个对象在run结束后被销毁.它仍然是指临时的.我想不是.

一个更干净的例子

编辑:评论之后,问题归结为

"在原始调用void start(std :: string && name);之后已经返回并且在std :: thread的构造函数结束之后,void run的字符串在哪里(std :: string && name);正在处理?"

最新的演示代码似乎表明Wrap被引用的对象runrun退出后被销毁.

the*_*ang 1

std::thread对象构造过程中的细节

上面帖子中接受的答案澄清了这里的情况。该函数run获取对临时对象的引用,该临时对象在函数完成后被run销毁。