信号量多线程同步输出 123123123

来源:互联网 发布:狩猎者安全防护软件 编辑:程序博客网 时间:2024/06/03 09:22
int g_Data[1024];
CRITICAL_SECTION g_cs;  
HANDLE g_hEvent1;
HANDLE g_hEvent2;
HANDLE g_hEvent3;
int g_nCount = 3;
int nPos = 0;


unsigned int __stdcall ThreadFun1(void* pM)  
{  

    for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent3, INFINITE);
//ResetEvent(g_hEvent3);
EnterCriticalSection(&g_cs);  
g_Data[nPos] = 1;
nPos++;
        LeaveCriticalSection(&g_cs); 
//
        ReleaseSemaphore(g_hEvent1, 1, NULL);  
        //通知缓冲区已为空  
        //SetEvent(g_hEvent2);  
  

}
       
    return 0;  



unsigned int __stdcall ThreadFun2(void* pM)  
{  


    for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent1, INFINITE);
//ResetEvent(g_hEvent1);
EnterCriticalSection(&g_cs);  
g_Data[nPos] = 2;
nPos++;
        LeaveCriticalSection(&g_cs);  
ReleaseSemaphore(g_hEvent2, 1, NULL);  
          
        //通知缓冲区已为空  
        //SetEvent(g_hEvent2);  
  

}
       
    return 0;  



unsigned int __stdcall ThreadFun3(void* pM)  
{  
    for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent2, INFINITE); 
//ResetEvent(g_hEvent2);
EnterCriticalSection(&g_cs);  
g_Data[nPos] = 3;
nPos++;
        LeaveCriticalSection(&g_cs);           
        //通知缓冲区已为空  
ReleaseSemaphore(g_hEvent3, 1, NULL);  
        //SetEvent(g_hEvent3);   

}
       
    return 0;  


int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSection(&g_cs);  



g_hEvent1 = CreateSemaphore(NULL, 0, 1, NULL);
g_hEvent2 = CreateSemaphore(NULL, 0, 1, NULL);
g_hEvent3 = CreateSemaphore(NULL, 1, 1, NULL);



HANDLE hThread[3];  
hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, NULL, 0, NULL);  
    hThread[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL); 
hThread[2] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun3, NULL, 0, NULL);
    WaitForMultipleObjects(3, hThread, TRUE, INFINITE);  
    CloseHandle(hThread[0]);  
    CloseHandle(hThread[1]);
CloseHandle(hThread[2]);


CloseHandle(g_hEvent1);
CloseHandle(g_hEvent2);
CloseHandle(g_hEvent3);
    DeleteCriticalSection(&g_cs); 

原创粉丝点击