gpt4 book ai didi

c++ - 多线程可以访问同一个 weak_ptr 对象 C++

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

所以我有这个类:

class Test
{
...
std::weak_ptr<W> m_w;
std::thread t1;
std::thread t2;
public:
Test (const std::shared_ptr<W> w);
void t1Task();
void t2Task();
...
}

在它的构造函数中,非常规则,它们被初始化:

...
m_w(w),
...
t1 = std::thread (&Test::t1Task, this);
t2 = std::thread (&Test::t2Task, this);

所以我的问题来了,我可以在这两个任务函数中使用 lock() 吗?考虑到它们是同时启动的,就像我在下面的代码中所做的那样?如果我不能,我该怎么办,因为我必须在两个线程中都获得一个 shared_ptrw 对象?

    void Test::t1Task ( )
{
std::shared_ptr<W> wPtr = m_w.lock(); // 1st line of this func
while(/*some condition*/)
{
// going to use wPtr in this while loop
}
}

void Test::t2Task()
{
std::shared_ptr<W> wPtr = m_w.lock(); // 1st line of this func
while(/*some condition*/)
{
// going to use wPtr in this while loop
}
}

最佳答案

调用lock 没有问题。 lock 不像互斥锁上的 lock,它会阻塞所有其他线程。它所做的是有效地锁定您进入指针的所有权,如果当时您的代码中的某些地方仍然存在有效的shared_ptr

这意味着你唯一需要做的就是在使用它之前检查 wPtr 是否不等于 nullptr 因为 lock 可以返回一个空的 shared_ptr


请注意,这不对指针指向的对象提供任何线程安全保证。您仍然必须确保以线程安全的方式访问它。不知道你在做什么,我不能说你的循环是否真的安全。

关于c++ - 多线程可以访问同一个 weak_ptr 对象 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861325/

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