【发布时间】:2013-03-30 08:54:25
【问题描述】:
我有一个线程类,我想偶尔从中获取一个实例变量的指针。我希望这种访问受到互斥锁的保护,以便在客户端完成其指针之前阻止线程访问此资源。
我最初的方法是返回一对对象:一个是指向资源的指针,一个是指向互斥锁对象的 shared_ptr。这个 shared_ptr 持有对锁定对象的唯一引用,因此当它超出范围时应该解锁互斥锁。像这样的:
void A::getResource()
{
Lock* lock = new Lock(&mMutex);
return pair<Resource*, shared_ptr<Lock> >(
&mResource,
shared_ptr<Lock>(lock));
}
此解决方案不太理想,因为它需要客户端持有整对对象。这样的行为破坏了线程安全:
Resource* r = a.getResource().first;
此外,我自己的实现是死锁,我很难确定原因,所以可能还有其他问题。
我想要的是一个包含锁作为实例变量的 shared_ptr,将它与访问资源的方法绑定。这似乎应该有一个既定的设计模式,但做了一些研究后,我惊讶地发现它很难遇到。
我的问题是:
- 这种模式有通用的实现方式吗?
- 将互斥锁放入我忽略的 shared_ptr 中是否存在问题,从而阻止了这种模式的广泛传播?
- 是否有充分的理由不实现我自己的 shared_ptr 类来实现此模式?
(注意我正在开发一个使用 Qt 的代码库,但不幸的是在这种情况下不能使用 boost。但是,涉及 boost 的答案仍然是普遍感兴趣的。)
【问题讨论】:
-
riv 和 Jonanthan Wakely 的回答都很有趣,值得关注。我选择 Riz 只是因为很高兴在答案中有一些完整的协作编辑代码。
标签: c++ thread-safety mutex smart-pointers raii