您的位置:首页 > 其它

windows api学习笔记-用临界区对象使线程同步

2010-02-09 12:44 183 查看
#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;

int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;//临界区
BOOL g_bContinue = TRUE;//线程结束标志

UINT WINAPI MyThread(LPVOID)
{
while(g_bContinue)
{
::EnterCriticalSection(&g_cs);//如果另一个线程在临界区的话,当前线程会一直等待下去
g_nCount1++;
g_nCount2++;
::LeaveCriticalSection(&g_cs);//把临界区还给Windows
}
return 0;
}

int main()
{
UINT uThreadId;
HANDLE h[2];
::InitializeCriticalSection(&g_cs);//临界区初始化
h[0] = (HANDLE)::_beginthreadex(
NULL,//线程安全性
0,//线程堆栈大小
MyThread,//线程函数的名称
NULL,//线程函数的参数
0,//立即启动
&uThreadId//内核给新生成的线程分配的线程ID
);
h[1] = (HANDLE)::_beginthreadex(
NULL,//线程安全性
0,//线程堆栈大小
MyThread,//线程函数的名称
NULL,//线程函数的参数
0,//立即启动
&uThreadId//内核给新生成的线程分配的线程ID
);
::Sleep(600);
g_bContinue = FALSE;
::WaitForMultipleObjects(
2,//要等待内核对象的数量
h,//句柄数组
TRUE,//是否要等待所有内核对象都成为受信状态
INFINITE//无限期等待下去
);
::CloseHandle(h[0]);
::CloseHandle(h[1]);
::DeleteCriticalSection(&g_cs);//删除林界区
cout<<g_nCount1<<"       "<<g_nCount2<<endl;
char a;
cin >> a;

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