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

一些适用于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:他们只是简单的小工具类,他们只是保证了“能用”,当中可能有很多不足,或者不适用特别的情况。

时间: 2024-09-28 12:50:57

简单的多线程同步的小工具类的相关文章

JAVA对象序列化保存为XML文件的工具类

java对象|xml   今天看了看java.beans包,发现了两个好东西,XMLEncoder和XMLDecoder.发现自己以前把从XML存取对象真是太费力气啦.做了小工具类,以后可以用用了. package com.imct.util; import java.beans.XMLDecoder;import java.beans.XMLEncoder;import java.io.File;import java.io.FileInputStream;import java.io.Fil

使用java基础类实现zip压缩和zip解压工具类分享_java

使用java基础类写的一个简单的zip压缩解压工具类 复制代码 代码如下: package sun.net.helper; import java.io.*;import java.util.logging.Logger;import java.util.zip.*; public class ZipUtil {    private final static Logger logger = Logger.getLogger(ZipUtil.class.getName());    privat

J2ME 2D小游戏入门之旅(二)完善周边工具类

二.完善周边工具类(图象.GameObject.Font) 虽然我们有了midp2.0的支持,但是有时还是需要一些辅助工具,方便我们使用.这怕是在进行真正的游戏设计之前最有趣的了. 1,首先是一个ImageTools工具类,提供一个方法帮助调用Imagepublic class ImageTools { protected ImageTools() { } public static Image getImage(String str){ Image img=null; try { img =

源码剖析AQS在几个同步工具类中的使用

感谢网友[张超盟]的投稿 1. 前言 AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础.J.U.C中宣传的封装良好的同步工具类Semaphore.CountDownLatch.ReentrantLock.ReentrantReadWriteLock.FutureTask等虽然各自都有不同特征,但是简单看一下源码,每个类内部都包含一个如下的内部类定义: abstract static class Sync extends Abstra

类-MFC多线程同步问题,互斥量

问题描述 MFC多线程同步问题,互斥量 共享资源是一些类对象的MAP,每个对象(某设备实例)中有不同的互斥量同步不同的类变量(本意是防止多线程访问同一个对象),现在迷糊了,互斥量放在类里面是不是不当?是不是在访问对象的时候就加互斥量来的方便(对整个对象进行加锁 - 因为对整个类操作较多,这么做貌似锁太深了)?求大神帮助 解决方案 这个要具体看对象的生存空间,和互斥量的作用!无法一概而论. 解决方案二: 搞这么麻烦干什么,线程同步直接用CreateMutex和WaitForSingleObject

Lucene5学习之LuceneUtils工具类简单封装

     周六花了整整一下午,将Lucene5中有关索引的常见操作进行了简单封装,废话不多说,上代码:   Java代码   package com.yida.framework.lucene5.util;      import java.io.IOException;   import java.util.concurrent.ExecutorService;   import java.util.concurrent.locks.Lock;   import java.util.concu

轻松把玩HttpClient之封装HttpClient工具类(四),单线程调用及多线程批量调用测试

       本文主要来分享一下该工具类的测试结果.工具类的整体源码不再单独分享,源码基本上都已经在文章中了.开始我们的测试.        单线程调用测试: public static void testOne() throws HttpProcessException{ System.out.println("--------简单方式调用(默认post)--------"); String url = "http://tool.oschina.net/"; //

Python语言编写电脑时间自动同步小工具_python

话不多说,小工具需求如下: 功能需求 -- 电脑开机后自动执行时间同步 非功能需求 -- 安装执行简单,无需安装额外环境 一.代码实现 基于以上需求,思路如下:访问网络获取北京时间,然后调用命令行来设置系统时间.程序写成Windows Service,并设置为开机自动运行.正好前段时间在学习Python,所以打算用Python来写这个工具.具体代码如下: 获取网络时间 复制代码 代码如下:  def getBeijinTime():     """  获取北京时间     &

工具类小产品 你们有平台化的困局

中介交易 SEO诊断 淘宝客 云主机 技术大厅 注:本文所指的小产品,主要为工具类产品.关于工具类产品,KPCB周炜曾称之为"侏儒项目",意指用户忠诚度低.很难长大的产品.虽说太狠,也有一定道理. 工具类产品有一些共同的特征,如低技术门槛.无内容继承性.无社交属性.本地化使用.有较高可复制性等缺点;也有体验优秀.UI出众.用户基础大.解决实际需求等优点.输入法.天气.笔记.公交查询等都被笔者划归到此类产品行列. 在一定程度上,这类产品用户粘性(打开频次)较高,能解决用户生活中遇到的某个