martin

thinking

常用链接

统计

software

最新评论

C++同步锁管理的一种方法

在C++中,通过提供构造函数、析构函数来对处理资源的获取、释放。
通过C++的这种机制,我们可以很方便地处理C++中的加锁同步机制。把锁对象作为Guard对象的一个成员(m_lock),然后在Guard对象的构造中对m_lock进行加锁:m_lock.acquire(),在Guard对象的析构函数中进行解锁:m_lock.release()。先给出代码实例如下:

template <class T>
class Guard
{
public :
        Guard(const T & lock);
        virtual ~Guard();

private:
        const T & m_lock;
};

template <class T>
Guard<T>::Guard(const T & lock) :
        m_lock(lock)
{
        m_lock.acquire();
}

template <class T>
Guard<T>::~Guard()
{
        m_lock.release();
}

我们可以在应用程序中这样使用它:

 void testFunc(.....)

{

  Guard<MutexWrapper>  guard(mutex);

  ...

}

在刚进入函数testFun(...),创建guard对象,并自动对mutex进行加锁,对特定数据(resource)进行保护。当应用离开testFunc函数模块时,根据guard对象的作用域和生命周期,此时guard对象的析构函数将被调用,因此将自动对mutex进行解锁。在此之后应用的其他线程将可以访问以前被mutex进行保护起来的资源。

 

利用上面的方法,我们可以包对资源的同步访问和访问控制交给C++的编译器,而不需要进行人工干预,从而减轻应用开发人员的工作负担。

posted on 2009-03-04 18:11 martin_yahoo 阅读(3975) 评论(8)  编辑 收藏 引用

评论

# re: C++同步锁管理的一种方法 2009-03-04 20:06 S.l.e!ep.¢%

template <class T>
Guard<T>::Guard(const T & lock) :
m_lock(lock)
{
m_lock.acquire(); // 如果这里锁失败,继续执行,然后......
}  回复  更多评论   

# re: C++同步锁管理的一种方法[未登录] 2009-03-05 09:35 martin_yahoo

@S.l.e!ep.¢%

如果程序在m_lock.acquire()处锁失败,则应用在此hang住,直到其他线程释放资源,并被该线程获取为止.此时这个线程会把资源所定.  回复  更多评论   

# re: C++同步锁管理的一种方法 2009-03-05 12:57 李现民

这其实是一种很常见的手法  回复  更多评论   

# re: C++同步锁管理的一种方法 2009-03-06 10:38 Matrixcoding

@martin_yahoo
人家说的不是hang住,是锁失败了,比如内存不够,锁函数抛出异常之类的问题~
另:为什么是const引用,那很多锁就不使用了~
  回复  更多评论   

# re: C++同步锁管理的一种方法[未登录] 2009-03-06 13:26 martin_yahoo

@Matrixcoding
至于异常处理,那就根据业务的需要进行异常处理就可以了.
至于const引用,就是避免在应用中对Guard中的成员m_lock进行更改.如果可以进行更改,则可能应用中多个线程要对同一资源加锁,可以更改后,可能处理的不是同一个锁,从而不能对资源进行有效地保护.  回复  更多评论   

# re: C++同步锁管理的一种方法 2009-03-06 14:25 Matrixcoding

@martin_yahoo
不能对m_llock进行更改,如何锁住?const引用只能调用m_lock的const成员~  回复  更多评论   

# re: C++同步锁管理的一种方法[未登录] 2009-03-06 15:48 martin_yahoo

m_lock 中含有一些成员不能更改,故采用了const修饰,对于加琐和释放部分利用mutable修饰.  回复  更多评论   

# re: C++同步锁管理的一种方法 2013-06-08 17:14 tb

会有异常情况处理吗  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理