//多线程同步
//临界区的同步应用
#define WIN32_LEAN_AND_MEAN
#include <STDIO.H>
#include <stdlib.h>
#include <WINDOWS.H>
HANDLE hThread1,hThread2;//线程1,2的句柄
DWORD ExitCode1,ExitCode2;//线程1,2的退出码
DWORD ThreadId1,ThreadId2;//线程1,2的线程ID
//①设置临界区对象
CRITICAL_SECTION CriticalSection;//边界区对象
DWORD WINAPI ThreadFun(LPVOID);
int main()
{
//②初始化临界区对象
InitializeCriticalSection(&CriticalSection);
hThread1 = CreateThread( //创建线程返回线程句柄
NULL, //安全属性,默认安全属性
0, //默认堆栈大小1MB
ThreadFun //线程函数地址
,(LPVOID)0 //线程函数参数
,NULL //允许你产生一个暂时挂起的线程,默认情况是“立即开始执行”
,&ThreadId1 //返回的线程ID
);
hThread2 = CreateThread(NULL,0,ThreadFun,(LPVOID)50,NULL,&ThreadId2);
GetExitCodeThread(hThread1,&ExitCode1);
GetExitCodeThread(hThread2,&ExitCode2);
Sleep(2000);
printf("\n线程1的ID:%ld,线程2的ID:%ld\n",ThreadId1,ThreadId2);
printf("线程1的退出码:%ld,线程2的退出码:%ld\n",ExitCode1,ExitCode2);
CloseHandle(hThread1);//解除绑定
CloseHandle(hThread2);
//⑤删除临界区对象的关联
DeleteCriticalSection(&CriticalSection);
return 0;
}
DWORD WINAPI ThreadFun(LPVOID n)
{
int Num = (int)n;
//③进入临界区
EnterCriticalSection(&CriticalSection);
while(Num<(int)n+50)
printf("%ld, ",++Num);
//④离开临界区
LeaveCriticalSection(&CriticalSection);
return (int)n;
}