gpt4 book ai didi

c++ - 在线程函数和普通函数中将 shared_ptr 传递给 weak_ptr 时的不同行为

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:54 25 4
gpt4 key购买 nike

我有一个线程函数,它接受一个 weak_ptr<>,我在线程函数中传递了我的 shared_ptr<>。

法律上 weak_ptr<> 不应增加 shared_ptr<> 的引用计数,但是,除非我在将 weak_ptr<> 传递给线程函数时使用 weak_ptr<> 进行类型转换,否则它会增加引用计数(意外)

此行为仅发生在线程函数中,而不会发生在普通函数调用中。

这里是线程函数的代码

void thrdfn(weak_ptr<int> wp) {
cout<<wp.use_count()<<endl; // Prints 2
}

int main() {
shared_ptr<int> sp = make_shared<int>();
thread th { thrdfn, (sp)};
th.join();
return 0;
}

但是,当我在创建线程时进行类型转换时,它的行为正常

void thrdfn(weak_ptr<int> wp) {
cout<<wp.use_count()<<endl; // Prints 1
}

int main() {
thread th { thrdfn, weak_ptr<int>(sp)}; // typecast
}

当我像普通函数调用一样调用该函数时,无需类型转换即可正常工作

void thrdfn(weak_ptr<int> wp) {
cout<<wp.use_count()<<endl; // Prints 1
}

int main() {
shared_ptr<int> sp = make_shared<int>();
thrdfn(sp);
return 0;
}

多个编译器的行为相同

最佳答案

当你编写一个 std::thread 时(我删除了多余的括号):

thread th{thrdfn, sp};

发生的事情是:

The new thread of execution starts executing

std::invoke(decay_copy(std::forward<Function>(f)), decay_copy(std::forward<Args>(args))...);

where decay_copy is defined as

template <class T>
std::decay_t<T> decay_copy(T&& v) { return std::forward<T>(v); }

也就是说,您的 shared_ptr 被复制到线程中,您从该拷贝中取出一个 weak_ptr。所以有两个 shared_ptr:你的和 thread 的。

关于c++ - 在线程函数和普通函数中将 shared_ptr 传递给 weak_ptr 时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559601/

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