简单的多线程同步的小工具类

一些适用于Windows下的多线程同步的小工具类。

快速互斥锁,封装了临界区的Windows API:
简单的多线程同步的小工具类class FastMutex
简单的多线程同步的小工具类{
简单的多线程同步的小工具类private:
简单的多线程同步的小工具类    CRITICAL_SECTION    m_Cs;
简单的多线程同步的小工具类
简单的多线程同步的小工具类public:
简单的多线程同步的小工具类    FastMutex() { ::InitializeCriticalSection(&this->m_Cs); }
简单的多线程同步的小工具类    ~FastMutex() { ::DeleteCriticalSection(&this->m_Cs); }
简单的多线程同步的小工具类    void    Lock()        { ::EnterCriticalSection(&this->m_Cs); }
简单的多线程同步的小工具类    bool    TryLock()    return ::TryEnterCriticalSection(&this->m_Cs) ? true : false; }
简单的多线程同步的小工具类    void    Unlock()    { ::LeaveCriticalSection(&this->m_Cs); }
简单的多线程同步的小工具类}
;

简单封装了Windows的信号量(Semaphore)的API。
简单的多线程同步的小工具类class FastSemaphore
简单的多线程同步的小工具类{
简单的多线程同步的小工具类private:
简单的多线程同步的小工具类    HANDLE    m_hSemaphore;
简单的多线程同步的小工具类    long m_lMaximumCount;
简单的多线程同步的小工具类
简单的多线程同步的小工具类public:
简单的多线程同步的小工具类    FastSemaphore(long lMaximumCount)
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        this->m_hSemaphore = ::CreateSemaphore(NULL, lMaximumCount, lMaximumCount, NULL);
简单的多线程同步的小工具类
简单的多线程同步的小工具类        if (this->m_hSemaphore == NULL) throw "Call to CreateSemaphore() failed. Could not create semaphore.";
简单的多线程同步的小工具类        this->m_lMaximumCount = lMaximumCount;
简单的多线程同步的小工具类    }
;
简单的多线程同步的小工具类
简单的多线程同步的小工具类    ~FastSemaphore() { ::CloseHandle(this->m_hSemaphore); };
简单的多线程同步的小工具类
简单的多线程同步的小工具类    long GetMaximumCount() const return this->m_lMaximumCount; };
简单的多线程同步的小工具类    void Inc() { ::WaitForSingleObject(this->m_hSemaphore, INFINITE); };
简单的多线程同步的小工具类    void Dec() { ::ReleaseSemaphore(this->m_hSemaphore, 1, NULL); };
简单的多线程同步的小工具类    void Dec(long lCount) { ::ReleaseSemaphore(this->m_hSemaphore, lCount, NULL); };
简单的多线程同步的小工具类}
;

读写互斥锁,多线程可以同时读取同一个文件,但是却不能同时写入同一个文件,对某一个文件的写操作必须是某一个线程所独占的。
简单的多线程同步的小工具类class ReadWriteMutex
简单的多线程同步的小工具类{
简单的多线程同步的小工具类private:
简单的多线程同步的小工具类    FastMutex        m_qMutex;
简单的多线程同步的小工具类    FastSemaphore    m_qSemaphore;
简单的多线程同步的小工具类
简单的多线程同步的小工具类public:
简单的多线程同步的小工具类    ReadWriteMutex(long lMaximumReaders): m_qSemaphore(lMaximumReaders) {};
简单的多线程同步的小工具类
简单的多线程同步的小工具类    void    lockRead() { m_qSemaphore.Inc(); };
简单的多线程同步的小工具类    void    unlockRead() { m_qSemaphore.Dec(); };
简单的多线程同步的小工具类
简单的多线程同步的小工具类    void lockWrite()
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        m_qMutex.Lock();
简单的多线程同步的小工具类        for (int i = 0; i < maxReaders(); ++i) m_qSemaphore.Inc();
简单的多线程同步的小工具类        m_qMutex.Unlock();
简单的多线程同步的小工具类    }
;
简单的多线程同步的小工具类
简单的多线程同步的小工具类    void    unlockWrite() {  m_qSemaphore.Dec(m_qSemaphore.GetMaximumCount()); };
简单的多线程同步的小工具类    int        maxReaders() const return m_qSemaphore.GetMaximumCount(); };
简单的多线程同步的小工具类}
;


区域锁
简单的多线程同步的小工具类template <class M>
简单的多线程同步的小工具类class ScopedLock
简单的多线程同步的小工具类{
简单的多线程同步的小工具类public:
简单的多线程同步的小工具类    inline ScopedLock(M& mutex): _mutex(mutex)
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        _mutex.Lock();
简单的多线程同步的小工具类    }

简单的多线程同步的小工具类    inline ~ScopedLock()
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        _mutex.Unlock();
简单的多线程同步的小工具类    }

简单的多线程同步的小工具类
简单的多线程同步的小工具类private:
简单的多线程同步的小工具类    M& _mutex;
简单的多线程同步的小工具类
简单的多线程同步的小工具类    ScopedLock();
简单的多线程同步的小工具类    ScopedLock(const ScopedLock&);
简单的多线程同步的小工具类    ScopedLock& operator = (const ScopedLock&);
简单的多线程同步的小工具类}
;
晓得区域锁咋用吧?
简单的多线程同步的小工具类void xxxFuc()
简单的多线程同步的小工具类{
简单的多线程同步的小工具类ScopeLock<FastMutex> mutex;
简单的多线程同步的小工具类简单的多线程同步的小工具类
简单的多线程同步的小工具类}

区域解锁
简单的多线程同步的小工具类template <class M>
简单的多线程同步的小工具类class ScopedUnlock
简单的多线程同步的小工具类{
简单的多线程同步的小工具类public:
简单的多线程同步的小工具类    inline ScopedUnlock(M& mutex, bool unlockNow = true): _mutex(mutex)
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        if (unlockNow)
简单的多线程同步的小工具类            _mutex.Unlock();
简单的多线程同步的小工具类    }

简单的多线程同步的小工具类    inline ~ScopedUnlock()
简单的多线程同步的小工具类    {
简单的多线程同步的小工具类        _mutex.Lock();
简单的多线程同步的小工具类    }

简单的多线程同步的小工具类
简单的多线程同步的小工具类private:
简单的多线程同步的小工具类    M& _mutex;
简单的多线程同步的小工具类
简单的多线程同步的小工具类    ScopedUnlock();
简单的多线程同步的小工具类    ScopedUnlock(const ScopedUnlock&);
简单的多线程同步的小工具类    ScopedUnlock& operator = (const ScopedUnlock&);
简单的多线程同步的小工具类}
;
简单的多线程同步的小工具类
与上面的区域锁的操作相反。

NOTE:他们只是简单的小工具类,他们只是保证了“能用”,当中可能有很多不足,或者不适用特别的情况。
上一篇:windows 消息机制、窗口过程与线程间消息传递


下一篇:《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.12 初始化软盘