天天看點

簡單的多線程同步的小工具類

一些适用于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

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    HANDLE    m_hSemaphore;

簡單的多線程同步的小工具類

    long m_lMaximumCount;

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    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

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    FastMutex        m_qMutex;

簡單的多線程同步的小工具類

    FastSemaphore    m_qSemaphore;

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    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

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    inline ScopedLock(M& mutex): _mutex(mutex)

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

        _mutex.Lock();

簡單的多線程同步的小工具類

    }

簡單的多線程同步的小工具類

    inline ~ScopedLock()

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

        _mutex.Unlock();

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    M& _mutex;

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    ScopedLock();

簡單的多線程同步的小工具類

    ScopedLock(const ScopedLock&);

簡單的多線程同步的小工具類

    ScopedLock& operator = (const ScopedLock&);

簡單的多線程同步的小工具類

曉得區域鎖咋用吧?

簡單的多線程同步的小工具類

void xxxFuc()

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

ScopeLock<FastMutex> mutex;

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

}

區域解鎖

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

class ScopedUnlock

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    inline ScopedUnlock(M& mutex, bool unlockNow = true): _mutex(mutex)

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

        if (unlockNow)

簡單的多線程同步的小工具類

            _mutex.Unlock();

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    inline ~ScopedUnlock()

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

    ScopedUnlock();

簡單的多線程同步的小工具類

    ScopedUnlock(const ScopedUnlock&);

簡單的多線程同步的小工具類

    ScopedUnlock& operator = (const ScopedUnlock&);

簡單的多線程同步的小工具類
簡單的多線程同步的小工具類

與上面的區域鎖的操作相反。

NOTE:他們隻是簡單的小工具類,他們隻是保證了“能用”,當中可能有很多不足,或者不适用特别的情況。

繼續閱讀