//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;
}
進程同步
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.