C++博客-云的天空-随笔分类-进程与线程http://www.cppblog.com/yunboy4/category/11307.htmlC++zh-cnSun, 26 Jul 2009 18:15:23 GMTSun, 26 Jul 2009 18:15:23 GMT60线程的同步http://www.cppblog.com/yunboy4/archive/2009/07/25/91181.htmlyunboyyunboySat, 25 Jul 2009 14:48:00 GMThttp://www.cppblog.com/yunboy4/archive/2009/07/25/91181.htmlhttp://www.cppblog.com/yunboy4/comments/91181.htmlhttp://www.cppblog.com/yunboy4/archive/2009/07/25/91181.html#Feedback0http://www.cppblog.com/yunboy4/comments/commentRss/91181.htmlhttp://www.cppblog.com/yunboy4/services/trackbacks/91181.html1.用事件对象来控制线程
//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)
    {
        ;
    }
}


yunboy 2009-07-25 22:48 发表评论
]]>