建立线程(使用互斥量同步,输出有序)
#include<stdio.h>
#include<process.h>
#include<windows.h>
long g_nNum;
unsigned int __stdcall Fun(void *pPM);
//事件与临界区
HANDLE g_hThParaMutex;
CRITICAL_SECTION g_csThreadCode;
int main()
{
HANDLE handle[10];
int i=0;
printf(" 线程同步 互斥量Mutex\n");
//初始化事互斥量与临界区,第二个参数为TRUE表示互斥量为创建线程所有
g_hThParaMutex=CreateMutex(NULL,FALSE,NULL);
//初始化临界区
InitializeCriticalSection(&g_csThreadCode);
g_nNum=0;
while(i<10)
{
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
WaitForSingleObject(g_hThParaMutex,INFINITE);
i++;
}
WaitForMultipleObjects(10,handle,TRUE,INFINITE);
DeleteCriticalSection(&g_csThreadCode);
//撤销事件和临界区
CloseHandle(g_hThParaMutex);
for(i=0;i<10;i++)
{
CloseHandle(handle[i]);
}
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum=*(int *)pPM;
ReleaseMutex(g_hThParaMutex);//触发互斥量Mutex
Sleep(50);//休眠50ms
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0);
printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);
LeaveCriticalSection(&g_csThreadCode);
Sleep(10000);
return 0;
}
建立线程(使用事件同步,输出有序)
#include<stdio.h>
#include<process.h>
#include<windows.h>
long g_nNum;
unsigned int __stdcall Fun(void *pPM);
//事件与临界区
HANDLE g_hThreadEvent;
CRITICAL_SECTION g_csThreadCode;
int main()
{
HANDLE handle[10];
int i=0;
printf(" 线程同步事件 Event\n");
//初始化事件自动置位,初始无触发的匿名事件
g_hThreadEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
//初始化临界区
InitializeCriticalSection(&g_csThreadCode);
g_nNum=0;
while(i<10)
{
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
WaitForSingleObject(g_hThreadEvent,INFINITE);
i++;
}
WaitForMultipleObjects(10,handle,TRUE,INFINITE);
//撤销事件和临界区
DeleteCriticalSection(&g_csThreadCode);
CloseHandle(g_hThreadEvent);
for(i=0;i<10;i++)
{
CloseHandle(handle[i]);
}
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum=*(int *)pPM;
SetEvent(g_hThreadEvent);
Sleep(50);
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0);
printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);
LeaveCriticalSection(&g_csThreadCode);
Sleep(10000);
return 0;
}