進程同步

//1生產者 1消費者 1緩衝區  
//使用二個事件,一個表示緩衝區空,一個表示緩衝區滿。  
//再使用一個關鍵段來控制緩衝區的訪問  
#include <stdio.h>  
#include <process.h>  
#include <windows.h>  
//設置控制檯輸出顏色  
BOOL SetConsoleColor(WORD wAttributes)  
{  
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);  
    if (hConsole == INVALID_HANDLE_VALUE)  
        return FALSE;     
    return SetConsoleTextAttribute(hConsole, wAttributes);  
}  
const int END_PRODUCE_NUMBER = 10;   //生產產品個數  
int g_Buffer;                        //緩衝區  
//事件與關鍵段  
CRITICAL_SECTION g_cs;  
HANDLE g_hEventBufferEmpty, g_hEventBufferFull;  
//生產者線程函數  
DWORD WINAPI ProducerThreadFun(PVOID pM)  
{  
    for (int i = 1; i <= END_PRODUCE_NUMBER; i++)  
    {  
        //等待緩衝區爲空  
        WaitForSingleObject(g_hEventBufferEmpty, INFINITE);  
  
        //互斥的訪問緩衝區  
        EnterCriticalSection(&g_cs);  
        g_Buffer = i;  
        printf("生產者將數據%d放入緩衝區\n", i);  
        LeaveCriticalSection(&g_cs);  
          
        //通知緩衝區有新數據了  
        SetEvent(g_hEventBufferFull);  
    }  
    return 0;  
}  
//消費者線程函數  
DWORD WINAPI ConsumerThreadFun(PVOID pM)  
{  
    volatile bool flag = true;  
    while (flag)  
    {  
        //等待緩衝區中有數據  
        WaitForSingleObject(g_hEventBufferFull, INFINITE);  
          
        //互斥的訪問緩衝區  
        EnterCriticalSection(&g_cs);  
        SetConsoleColor(FOREGROUND_GREEN);  
        printf("  消費者從緩衝區中取數據%d\n", g_Buffer);  
        SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
        if (g_Buffer == END_PRODUCE_NUMBER)  
            flag = false;  
        LeaveCriticalSection(&g_cs);  
          
        //通知緩衝區已爲空  
        SetEvent(g_hEventBufferEmpty);  
  
        Sleep(10); //some other work should to do  
    }  
    return 0;  
}  
int main()  
{  
    printf("  生產者消費者問題   1生產者 1消費者 1緩衝區\n\n");  
 //   printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");  
  
    InitializeCriticalSection(&g_cs);  
    //創建二個自動復位事件,一個表示緩衝區是否爲空,另一個表示緩衝區是否已經處理  
    g_hEventBufferEmpty = CreateEvent(NULL, FALSE, TRUE, NULL);  
    g_hEventBufferFull = CreateEvent(NULL, FALSE, FALSE, NULL);  
      
    const int THREADNUM = 2;  
    HANDLE hThread[THREADNUM];  
      
    hThread[0] = CreateThread(NULL, 0, ProducerThreadFun, NULL, 0, NULL);  
    hThread[1] = CreateThread(NULL, 0, ConsumerThreadFun, NULL, 0, NULL);  
    WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);  
    CloseHandle(hThread[0]);  
    CloseHandle(hThread[1]);  
      
    //銷燬事件和關鍵段  
    CloseHandle(g_hEventBufferEmpty);  
    CloseHandle(g_hEventBufferFull);  
    DeleteCriticalSection(&g_cs);  
    return 0;  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章