gpt4 book ai didi

c++ - boost shared_ptr 是线程安全的吗?

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

当使用 boost shared_ptr 时,以下代码线程安全吗?谢谢!

class CResource
{
xxxxxx
}
class CResourceBase
{
CResourceBase()
{
m_pMutex = new CMutex;
}
~CResourceBase()
{
ASSERT(m_pMutex != NULL);
delete m_pMutex;
m_pMutex = NULL;
}
private:
CMutex *m_pMutex;
public:
void SetResource(shared_ptr<CResource> res)
{
CSingleLock lock(m_pMutex);
lock.Lock();
m_Res = res;
lock.Unlock();
}

shared_ptr<CResource> GetResource()
{
CSingleLock lock(m_pMutex);
lock.Lock();
shared_ptr<CResource> res = m_Res;
lock.Unlock();
return res ;
}
private:
shared_ptr<CResource> m_Res;
}

CResourceBase base;
//----------------------------------------------
Thread A:
while (true)
{
......
shared_ptr<CResource> nowResource = base.GetResource();
nowResource.doSomeThing();
...
}

Thread B:
shared_ptr<CResource> nowResource;
base.SetResource(nowResource);
...

最佳答案

在您的示例中 不存在竞争可能性(它已正确锁定)。但是,您应该非常小心地使用多线程代码中的 shared_ptr。请记住,您有可能通过来自不同线程的不同 shared_ptr 访问同一个对象。例如,之后:

Thread B:
shared_ptr<CResource> nowResource;
base.SetResource(nowResource);
...

线程 B 仍然可以访问 nowResource。如果线程 A 获得资源 ptr,两个线程可以同时使用对象无需任何同步!

这当然是竞争条件。

关于c++ - boost shared_ptr<XX> 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696308/

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