线程同步方法

线程同步方法

 临界区    ->  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();
            //告诉其他线程,现在可以加锁了
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值