线程同步方法

来源:互联网 发布:梦幻西游网络出错 编辑:程序博客网 时间:2024/04/20 20:42

线程同步方法

 临界区    ->  CCriticalSection //Critical  鉴定的;临界的;批评的;爱挑剔的;   临界区对象是应用程序对象,以下三个都是Windows的内核对象,所以使用临  界区对象相对来说要快点 互斥量     -> CMutex //mutex  互斥,互斥量 信号量    ->  CSemaphore //Semaphore 信号量 事件 ->  CEvent 以上四个类都是封装好的c++的类,可以直接使用 1:首先介绍临界区,以上次做到线程同步为例,  

这里写图片描述

   先定义一个临界区指针,然后在构造函数里创建一个新对象,析构函数里释放对象,析构函数需要在.h文件里声明

这里写图片描述
这里写图片描述
这里写图片描述
然后在共享资源区分别进行加锁解锁就可以了
这里写图片描述
加锁后该区域的代码就不能并发执行了,这里如果正在执行线程A的代码,此时如果点击按钮2,不会像之前没有加锁一样会出现错误的结果,而是线程B等待线程A执行完毕后再执行,所以这样虽然速度慢点,但是保证了结果是正确的,第一中线程同步方法就是这么简单

2:互斥量
和方法一 一样, 定义一个CMutex指针,在构造函数里创建一个对象,析构函数里释放,使用互斥量最简单的方法是使用CSingleLock;

    CSingleLock singleLock(g_pMutex);    for(int i=1;i<=100000000;i++)    {        //加锁        signleLock->Lock();//有可能没锁住,要判断一下        if(singleLock.IsLocked())        {            k=k*2;            k=k/2;            total+=k;            //解锁            singleLock.Unlock();        }    }

3: 信号量
注意信号量初始化时:

g_pSemaphore = new CSemaphore(1,1);

信号量对象是很复杂的,可以做复杂的线程同步,这里的例子比较简单,只用将这两个参数设为1就可以了

 CSingleLock singleLock(g_pSemaphore);    for(int i=1;i<=100000000;i++)    {        //加锁        signleLock->Lock();//有可能没锁住,要判断一下        if(singleLock.IsLocked())        {            k=k*2;            k=k/2;            total+=k;            //解锁            singleLock.Unlock();        }    }

4:事件
初始化时:

 g_pEvent=new CEvent(TRUE);     //初始时有信号,有信号就可以进行加锁  

然后就可以使用信号对象进行同步了

 CSingleLock singleLock(g_pSemaphore);    for(int i=1;i<=100000000;i++)    {        //加锁        signleLock->Lock();//有可能没锁住,要判断一下        if(singleLock.IsLocked())        {            k=k*2;            k=k/2;            total+=k;            //解锁            singleLock.Unlock();            //事件对象不同,还要加上SetEvent            g_pEvent->SetEvent();            //告诉其他线程,现在可以加锁了        }    }
0 0
原创粉丝点击