线程的同步

线程的同步
1 .用事件对象来控制线程
// Define thread function
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
    
for (;;)
    {
        WaitForSingleObject(hEvent, INFINITE);      
// 阻塞线程,直到事件对象为通知状态
         if  (WorkerID < MAXWORKERID)
        {

            WorkerID 
+= 1 ;
            Sleep(
1000 );
            printf(
" ThreadOne print out: %i \n " ,WorkerID);
        }
        SetEvent(hEvent);       
// 设置事件为通知状态
    }    
    
return   0 ;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
    
for (;;)
    {
        WaitForSingleObject(hEvent, INFINITE);
        
if  (WorkerID < MAXWORKERID)
        {
            WorkerID 
+= 1 ;
            printf(
" ThreadTwo print out: %i \n " ,WorkerID);
            Sleep(
1000 );
        }
        SetEvent(hEvent);
    }
    
return   0 ;
}
void  main()
{
    
// Define thread handle
    HANDLE hThread1,hThread2;
    hEvent 
=  CreateEvent(NULL, FALSE, TRUE,  " Event " );
    
// Create thread
    hThread1  =  ::CreateThread(NULL, 0 ,ThreadFunOne,NULL, 0 ,NULL);
    hThread2 
=  ::CreateThread(NULL, 0 ,ThreadFunTwo,NULL, 0 ,NULL);
    
// Close thread handle
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    
// Note: Prevent process exiting
     while  ( true )
    {
        ;
    }
}

2 .用临界区来控制线程
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
    
for (;;)
    {
        EnterCriticalSection(
& Section);
        
if  (WorkerID < MAXWORKERID)
        {

            WorkerID 
+= 1 ;
            Sleep(
1000 );
            printf(
" ThreadOne print out: %i \n " ,WorkerID);
        }
        LeaveCriticalSection(
& Section);
    }
    
return   0 ;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
    
for (;;)
    {
        EnterCriticalSection(
& Section);
        
if  (WorkerID < MAXWORKERID)
        {
            WorkerID 
+= 1 ;
            printf(
" ThreadTwo print out: %i \n " ,WorkerID);
            Sleep(
1000 );
        }
        LeaveCriticalSection(
& Section);
    }
    
return   0 ;
}
void  main()
{
    
// Define thread handle
    HANDLE hThread1,hThread2;
    InitializeCriticalSection(
& Section);
    
// Create thread
    hThread1  =  ::CreateThread(NULL, 0 ,ThreadFunOne,NULL, 0 ,NULL);
    hThread2 
=  ::CreateThread(NULL, 0 ,ThreadFunTwo,NULL, 0 ,NULL);
    
// Close thread handle
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    
// Note: Prevent process exiting
     while  ( true )
    {
        ;
    }
}

3 .用互斥来控制线程
DWORD __stdcall ThreadFunOne(LPVOID lParam)
{
    
for (;;)
    {
        WaitForSingleObject(hMutex, INFINITE);
        
if  (WorkerID < MAXWORKERID)
        {

            WorkerID 
+= 1 ;
            Sleep(
1000 );
            printf(
" ThreadOne print out: %i \n " ,WorkerID);
        }
        ReleaseMutex(hMutex);
    }
    
return   0 ;
}
DWORD __stdcall ThreadFunTwo(LPVOID lParam)
{
    
for (;;)
    {
        WaitForSingleObject(hMutex, INFINITE);
        
if  (WorkerID < MAXWORKERID)
        {
            WorkerID 
+= 1 ;
            printf(
" ThreadTwo print out: %i \n " ,WorkerID);
            Sleep(
1000 );
        }
        ReleaseMutex(hMutex);
    }
    
return   0 ;
}
void  main()
{
    
// Define thread handle
    HANDLE hThread1,hThread2;
    hMutex 
=  CreateMutex(NULL, FALSE,  " mutex " );
    
// Create thread
    hThread1  =  ::CreateThread(NULL, 0 ,ThreadFunOne,NULL, 0 ,NULL);
    hThread2 
=  ::CreateThread(NULL, 0 ,ThreadFunTwo,NULL, 0 ,NULL);
    
// Close thread handle
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    
// Note: Prevent process exiting
     while  ( true )
    {
        ;
    }
}

你可能感兴趣的:(线程的同步)