线程同步方法
临界区 -> 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();
//告诉其他线程,现在可以加锁了
}
}