建立线程(线程间无同步互斥,输出乱序)
#include<stdio.h>
#include<process.h>
#include<windows.h>
long g_nNum;
unsigned int __stdcall Fun(void *pMD);
int main()
{
HANDLE handle[10];
int i=0;
g_nNum=0;
while(i<10)
{
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
i++;
}
WaitForMultipleObjects(10,handle,TRUE,INFINITE);
for(i=0;i<10;i++)
CloseHandle(handle[i]);
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum=*(int *)pPM;
Sleep(50);
g_nNum++;
Sleep(0);
printf("线程编号为%d,全局资源值为%d\n",nThreadNum,g_nNum);
Sleep(10000);
return 0;
}
建立线程(使用临界区同步,输出有序)
#include<stdio.h>
#include<process.h>
#include<windows.h>
long g_nNum;
unsigned int __stdcall Fun(void *pPM);
CRITICAL_SECTION g_csThreadParameter,g_csThreadCode;
int main()
{
HANDLE handle[10];
int i=0;
InitializeCriticalSection(&g_csThreadParameter);
InitializeCriticalSection(&g_csThreadCode);
g_nNum=0;
while(i<10)
{
EnterCriticalSection(&g_csThreadParameter);
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
++i;
}
WaitForMultipleObjects(10,handle,TRUE,INFINITE);
DeleteCriticalSection(&g_csThreadCode);
DeleteCriticalSection(&g_csThreadParameter);
for(i=0;i<10;i++)
CloseHandle(handle[i]);
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum=*(int *)pPM;
LeaveCriticalSection(&g_csThreadParameter);
Sleep(50);
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0);
printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);
LeaveCriticalSection(&g_csThreadCode);
Sleep(10000);
return 0;
}