您的位置:首页 > 其它

Windows多线程同步系列之二-----关键区

2015-07-29 14:57 120 查看
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权。

关键区同步主要有以下几个API



初始化关键区对象,无返回值,传入一个关键区对象的指针。





该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针





该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数

将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。





该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,而LeaveCriticalSection是释放

关键区所有权,离开关键区。

我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写

#include <windows.h>
#include <stdio.h>

static int number=10;
CRITICAL_SECTION CriticalSection;

DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
printf("窗口1售票开始:\n");
while(1)
{
EnterCriticalSection(&CriticalSection);
if(number>0)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep(1000);
}
LeaveCriticalSection(&CriticalSection);
Sleep(100);
}
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
printf("窗口2售票开始:\n");
while(1)
{
EnterCriticalSection(&CriticalSection);
if(number>0)
{
printf("窗口2售出第%d张票...\n",number);
Sleep(1000);
number--;
}
LeaveCriticalSection(&CriticalSection);
Sleep(100);
}
return 0;
}

int main()
{
HANDLE HOne,HTwo;
InitializeCriticalSection(&CriticalSection);
printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==0)
{
printf("不好意思,票卖完了!\n");
DeleteCriticalSection(&CriticalSection);
return 0;
}
else
{
continue;
}
}

return 0;
}


运行截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: