根据cppref的说法,跨多个线程访问const
的shared_ptr
成员是安全的。但是,当我们拥有与weak_ptr
相对应的shared_ptr
时,此语句是否有效?
作为示例,假定以下代码:
#include <memory>
#include <iostream>
#include <thread>
std::shared_ptr<int> sp;
std::weak_ptr<int> gw;
int main()
{
sp = std::make_shared<int>(42);
gw = sp;
auto th1 = std::thread([]{
for (int i = 0; i < 200; i++) {
if (sp.use_count() > 1) {
std::cout << i << "\n";
std::this_thread::yield();
}
}
});
auto th2 = std::thread([]{
for (int i = 0; i < 20; i++) {
if (auto l = gw.lock()) {
std::cout << "locked ->" << l.use_count() << "\n";
std::this_thread::yield();
}
}
});
th1.join();
th2.join();
}
此代码创建2个线程。一种检查
use_count()
方法的shared_ptr()
的const
,另一种使用lock()
锁定也是weak_ptr()
方法的const
。但是实际上,当我在lock
上调用weak_ptr
时,实际上增加了shared_ptr
的引用计数,除非内部保护了引用计数,否则它不是线程安全的。我想知道在这种情况下是否会进行数据竞赛。按照标准,这应该是线程安全的吗?
最佳答案
是。引用计数器是原子的,因此您的示例中没有数据争用。
话虽这么说,对std::shared_ptr
指向的对象的可变操作不是原子的,所以必须加以保护,就像通过纯指针保护访问一样。
关于c++ - std::weak_ptr和对应的std::shared_ptr之间是否存在任何数据争用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62138000/