gpt4 book ai didi

c++ - 在新线程中访问 move 的 std::string

转载 作者:可可西里 更新时间:2023-11-01 18:39:25 27 4
gpt4 key购买 nike

考虑下面的情况

名称字符串作为参数 move 到线程。

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

线程的运行函数也采用右值引用。

 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;
}
}

线程是通过启动函数创建的,如下所示:

  ThreadRunner r;
r.start(std::string("somename"));

问题是。通过 pthread_setname_np 在函数 run 中访问的 std::string 是否可能是垃圾,因为临时对象在作用域结束时超出了作用域?

Demo上面的demo中,call结束后,是否保证somename字符串在run函数中有效?

编辑: Demo with constructors/destructors问题中的 std::string 现在替换为 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 结束后销毁。它是否仍然指的是临时的。我认为不是。

A more clean example

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

"After the original call to void start(std::string&& name); has returned and after the constructor of std::thread has ended, where is the string that void run(std::string&& name); is working on? "

最新的演示代码似乎表明 run 引用的对象 Wraprun 退出后被销毁。

最佳答案

Details in the process of constructing a std::thread object

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

关于c++ - 在新线程中访问 move 的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43624741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com