gpt4 book ai didi

c++ - 通过 const 引用传递 shared_ptr 是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-30 03:41:49 26 4
gpt4 key购买 nike

我经常读到我应该通过 const 引用将 shared_ptr 传递给函数,因为它更快。当我想到它时,我不确定这是否是一个真正好的建议,因为我不确定这是否会节省线程。谁能告诉我这是否会节省线程以通过 const ref?

最佳答案

您应该更喜欢通过 const& 传递以避免任何类拷贝的开销。例如,这对于像 std::string 这样的东西特别重要。

在通过const& 传递shared_ptr 的情况下,开销主要是incrementing and decrementing of the reference count因为它是原子的。

但是!使用 const& shared_ptr 创建线程时有一个陷阱:引用计数将递增。因为它是递增的,所以几乎就像您按值传递它一样。实际上,您是按值传递给 std::thread 构造函数,因此是递增,然后按 ref 传递给函数。

自己看看:

// gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
void test(const shared_ptr<int>& i)
{
cout << "c = " << i.use_count() << endl;
}

int main(int argc, char** argv)
{
shared_ptr<int> i(new int);
cout << "c = " << i.use_count() << endl;
test(i);

cout << "thread!" << endl;
thread t(test, i);
t.join();
cout << "c = " << i.use_count() << endl;
}

结果是:

c = 1
c = 1
thread!
c = 2 // <= incremented!
c = 1 // <= thread joined!

shared_ptr 是线程安全的完美候选者,但它不会保护您免受竞争条件和死锁的影响。

关于c++ - 通过 const 引用传递 shared_ptr 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37139160/

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