boost中的mutex与lock

本文介绍了Boost库中mutex和lock的使用,包括基础的mutex用法、lock辅助类的作用,以及boost::mutex、boost::shared_mutex、boost::recursive_mutex等不同类型的mutex。通过示例解释了读写锁的概念,并提醒了在使用mutex时应注意的细节,如CreateMutex参数的设置,以避免潜在的问题。最后提到了boost::lock_guard和boost::unique_lock的区别和用法。
摘要由CSDN通过智能技术生成

最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换。这里总结一下。


对于mutex和lock,要明确一点,真正起到互斥作用的mutex,而lock可以认为是协助mutex令我们在使用时更方便。搞不清楚二者关系的可以参考这里:从高中一次半夜不冲厕所的经历谈程序


最基础的mutex的使用方法是这样的:

HANDLE g_mutex = NULL;

void test()
{
    ::WaitForSingleObject(g_mutex, INFINITE);
    //do something...
    ReleaseMutex(g_mutex);
}

使用匿名的互斥体,test函数中调用WaitForSingleObject等待其他线程释放g_mutex。INFINITE表示一直等待,也可以设置等待超时时间。

当前线程获得g_mutex后执行do something,之后释放g_mutex。

这里使用的是匿名互斥体,当然,在程序中需要多个互斥体时,可以通过CreateMutex创建命名互斥体,也可以通过OpenMutex打开一个互斥体。


不过很少有人像上面那样直接使用吧,太简单粗暴了,互斥体作为一个基本功能模块,怎么说也会封装一下,让别人用起来更爽些。如下是一个简单封装:

class MyMutex
{
public:
    MyMutex()
        :m_hMutex(NULL)
    {
    }
    MyMutex(wchar_t* pMutexName)
        :m_hMutex(NULL)
    {
        createMutex(pMutexName);
    }
    virtual ~MyMutex()
    {
       destroyMutex();
    }
    bool lock()
    {
        return m_hMutex ? (::WaitForSingleObject(m_hMutex,INFINITE) == WAIT_OBJECT_0) : false;
    }
    void unlock()
    {
        ReleaseMutex(m_hMutex);
    }
    bool createMutex(wchar_t* pMutexName)
    {
        if (m_hMutex)
        {
            return true;
        }
        m_hMutex = ::CreateMutex(NULL, FALSE, pMutexName);
        return m_hMutex != NULL;
    }
    void destroyMutex()
    {
        CloseHandle(m_hMutex);
        m_hMutex = NULL;
    }
    bool openMutex(wchar_t* pMutexName)
    {
        if (m_hMutex)
        {
            return true;
        }
        m_hMutex = ::OpenMutex(SYNCHRONIZE, FALSE, pMutexName);
        return m_hMutex != NULL;
    }
private:
    HANDLE m_hMutex;
};

封装之后,就可以如下使用:

void test1()
{
    MyMutex mutex;
    mutex.createMutex(L"mutex_test_name1");
    if (mutex.lock())
    {
        //do something...
        mutex.unlock();
    }
}

但是,就像 从高中一次半
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值