2012-05-25 39 views
1

我有一个构造函数,可以允许用户将一个ponter传递给一个Boost互斥锁。如果未提供互斥锁,则会员指针pMyMutex设置为NULL。这使得用户可以根据需要选择一些线程安全性。但是,我不能使用这种检查的scoped_lock出于显而易见的原因:)在范围锁定之前检查可选的互斥锁

if (pMyMutex != NULL) 
    const boost::mutex::scoped_lock l(*pMyMutex); 

//The lock is already out of scope 
processStuff(x, y, z); 

任何人都可以提出一个整洁和简单的解决方案,这样的要求?

回答

5

实施与scoped_lock类似的自定义包装来隐藏其中的决定:将指针包装为互斥体并检查指针是否为null(不应用锁定)或不为null(锁定应用)。一些骨架:

class ScopedLockEx 
{ 
public: 
    ScopedLockEx(boost::mutex* pMutex) 
     : pMutex_(pMutex) 
    { 
     if(pMutex_) pMutex_->lock(); 
    } 

    ~ScopedLockEx() 
    { 
     if(pMutex_) pMutex_->unlock(); 
    } 
private: 
    boost::mutex* pMutex_; 
}; 
+1

这可能是我会做的,但另一种解决方案是'std :: auto_ptr '。 –

+0

作品。谢谢 – learnvst