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

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

快速互斥锁,封装了临界区的Windows API:
None.gif class FastMutex
ExpandedBlockStart.gif {
InBlock.gifprivate:
InBlock.gif    CRITICAL_SECTION    m_Cs;
InBlock.gif
InBlock.gifpublic:
ExpandedSubBlockStart.gif    FastMutex() { ::InitializeCriticalSection(&this->m_Cs); }
ExpandedSubBlockStart.gif    ~FastMutex() { ::DeleteCriticalSection(&this->m_Cs); }
ExpandedSubBlockStart.gif    void    Lock()        { ::EnterCriticalSection(&this->m_Cs); }
ExpandedSubBlockStart.gif    bool    TryLock()    return ::TryEnterCriticalSection(&this->m_Cs) ? true : false; }
ExpandedSubBlockStart.gif    void    Unlock()    { ::LeaveCriticalSection(&this->m_Cs); }
ExpandedBlockEnd.gif}
;

简单封装了Windows的信号量(Semaphore)的API。
None.gif class FastSemaphore
ExpandedBlockStart.gif {
InBlock.gifprivate:
InBlock.gif    HANDLE    m_hSemaphore;
InBlock.gif    long m_lMaximumCount;
InBlock.gif
InBlock.gifpublic:
InBlock.gif    FastSemaphore(long lMaximumCount)
ExpandedSubBlockStart.gif    {
InBlock.gif        this->m_hSemaphore = ::CreateSemaphore(NULL, lMaximumCount, lMaximumCount, NULL);
InBlock.gif
InBlock.gif        if (this->m_hSemaphore == NULL) throw "Call to CreateSemaphore() failed. Could not create semaphore.";
InBlock.gif        this->m_lMaximumCount = lMaximumCount;
ExpandedSubBlockEnd.gif    }
;
InBlock.gif
ExpandedSubBlockStart.gif    ~FastSemaphore() { ::CloseHandle(this->m_hSemaphore); };
InBlock.gif
ExpandedSubBlockStart.gif    long GetMaximumCount() const return this->m_lMaximumCount; };
ExpandedSubBlockStart.gif    void Inc() { ::WaitForSingleObject(this->m_hSemaphore, INFINITE); };
ExpandedSubBlockStart.gif    void Dec() { ::ReleaseSemaphore(this->m_hSemaphore, 1, NULL); };
ExpandedSubBlockStart.gif    void Dec(long lCount) { ::ReleaseSemaphore(this->m_hSemaphore, lCount, NULL); };
ExpandedBlockEnd.gif}
;

读写互斥锁,多线程可以同时读取同一个文件,但是却不能同时写入同一个文件,对某一个文件的写操作必须是某一个线程所独占的。
None.gif class ReadWriteMutex
ExpandedBlockStart.gif {
InBlock.gifprivate:
InBlock.gif    FastMutex        m_qMutex;
InBlock.gif    FastSemaphore    m_qSemaphore;
InBlock.gif
InBlock.gifpublic:
ExpandedSubBlockStart.gif    ReadWriteMutex(long lMaximumReaders): m_qSemaphore(lMaximumReaders) {};
InBlock.gif
ExpandedSubBlockStart.gif    void    lockRead() { m_qSemaphore.Inc(); };
ExpandedSubBlockStart.gif    void    unlockRead() { m_qSemaphore.Dec(); };
InBlock.gif
InBlock.gif    void lockWrite()
ExpandedSubBlockStart.gif    {
InBlock.gif        m_qMutex.Lock();
InBlock.gif        for (int i = 0; i < maxReaders(); ++i) m_qSemaphore.Inc();
InBlock.gif        m_qMutex.Unlock();
ExpandedSubBlockEnd.gif    }
;
InBlock.gif
ExpandedSubBlockStart.gif    void    unlockWrite() {  m_qSemaphore.Dec(m_qSemaphore.GetMaximumCount()); };
ExpandedSubBlockStart.gif    int        maxReaders() const return m_qSemaphore.GetMaximumCount(); };
ExpandedBlockEnd.gif}
;


区域锁
None.giftemplate < class M>
None.gif class ScopedLock
ExpandedBlockStart.gif {
InBlock.gifpublic:
InBlock.gif    inline ScopedLock(M& mutex): _mutex(mutex)
ExpandedSubBlockStart.gif    {
InBlock.gif        _mutex.Lock();
ExpandedSubBlockEnd.gif    }

InBlock.gif    inline ~ScopedLock()
ExpandedSubBlockStart.gif    {
InBlock.gif        _mutex.Unlock();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gifprivate:
InBlock.gif    M& _mutex;
InBlock.gif
InBlock.gif    ScopedLock();
InBlock.gif    ScopedLock(const ScopedLock&);
InBlock.gif    ScopedLock& operator = (const ScopedLock&);
ExpandedBlockEnd.gif}
;
晓得区域锁咋用吧?
None.gif void xxxFuc()
ExpandedBlockStart.gif {
InBlock.gifScopeLock<FastMutex> mutex;
InBlock.gifdot.gif
ExpandedBlockEnd.gif}

区域解锁
None.giftemplate < class M>
None.gif class ScopedUnlock
ExpandedBlockStart.gif {
InBlock.gifpublic:
InBlock.gif    inline ScopedUnlock(M& mutex, bool unlockNow = true): _mutex(mutex)
ExpandedSubBlockStart.gif    {
InBlock.gif        if (unlockNow)
InBlock.gif            _mutex.Unlock();
ExpandedSubBlockEnd.gif    }

InBlock.gif    inline ~ScopedUnlock()
ExpandedSubBlockStart.gif    {
InBlock.gif        _mutex.Lock();
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gifprivate:
InBlock.gif    M& _mutex;
InBlock.gif
InBlock.gif    ScopedUnlock();
InBlock.gif    ScopedUnlock(const ScopedUnlock&);
InBlock.gif    ScopedUnlock& operator = (const ScopedUnlock&);
ExpandedBlockEnd.gif}
;
None.gif
与上面的区域锁的操作相反。

NOTE:他们只是简单的小工具类,他们只是保证了“能用”,当中可能有很多不足,或者不适用特别的情况。
目录
相关文章
|
1月前
|
Java 云计算
Java多线程编程中的同步与互斥机制探析
在当今软件开发领域,多线程编程是一项至关重要的技能。本文将深入探讨Java中的同步与互斥机制,分析其在多线程环境下的应用及实现原理,帮助读者更好地理解并运用这一关键技术。
24 4
|
1月前
|
Python
在Python中,如何保证多个线程之间的同步?
在Python中,如何保证多个线程之间的同步?
24 4
|
1月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
33 0
|
17天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
18天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
23 4
|
20天前
|
Java Spring
springboot单类集中定义线程池
该内容是关于Spring中异步任务的配置和使用步骤。首先,在启动类添加`@EnableAsync`注解开启异步支持。然后,自定义线程池类`EventThreadPool`,设置核心和最大线程数、存活时间等参数。接着,将线程池bean注入到Spring中,如`@Bean(&quot;RewardThreadPool&quot;)`。最后,在需要异步执行的方法上使用`@Async`注解,例如在一个定时任务类中,使用`@Scheduled(cron = &quot;...&quot;)`和`@Async`结合实现异步定时任务。
16 2
|
30天前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
51 2
|
1月前
|
存储 编解码 算法
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
【ffmpeg音视频同步】解决ffmpeg音视频中多线程之间的数据同步问题
40 2
|
1月前
|
安全 C++ 开发者
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
18 0
|
1月前
|
安全 Java Unix
【C++ 包裹类 std::thread】探索C++11 std::thread:如何使用它来创建、销毁和管理线程
【C++ 包裹类 std::thread】探索C++11 std::thread:如何使用它来创建、销毁和管理线程
44 0