秒杀多线程第十篇 生产者消费者问题

//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;//生产者线程函数unsigned int __stdcall 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;}//消费者线程函数unsigned int __stdcall 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");printf(" — by 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] = (HANDLE)_beginthreadex(NULL, 0, ProducerThreadFun, NULL, 0, NULL);hThread[1] = (HANDLE)_beginthreadex(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;}

//1生产者 2消费者 4缓冲区#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 = 8; //生产产品个数const int BUFFER_SIZE = 4;//缓冲区个数int g_Buffer[BUFFER_SIZE];//缓冲池int g_i, g_j;//信号量与关键段CRITICAL_SECTION g_cs;HANDLE g_hSemaphoreBufferEmpty, g_hSemaphoreBufferFull;//生产者线程函数unsigned int __stdcall ProducerThreadFun(PVOID pM){for (int i = 1; i <= END_PRODUCE_NUMBER; i++){//等待有空的缓冲区出现WaitForSingleObject(g_hSemaphoreBufferEmpty, INFINITE);//互斥的访问缓冲区EnterCriticalSection(&g_cs);g_Buffer[g_i] = i;printf("生产者在缓冲池第%d个缓冲区中投放数据%d\n", g_i, g_Buffer[g_i]);g_i = (g_i + 1) % BUFFER_SIZE;LeaveCriticalSection(&g_cs);//通知消费者有新数据了ReleaseSemaphore(g_hSemaphoreBufferFull, 1, NULL);}printf("生产者完成任务,线程结束运行\n");return 0;}//消费者线程函数unsigned int __stdcall ConsumerThreadFun(PVOID pM){while (true){//等待非空的缓冲区出现WaitForSingleObject(g_hSemaphoreBufferFull, INFINITE);//互斥的访问缓冲区EnterCriticalSection(&g_cs);SetConsoleColor(FOREGROUND_GREEN);printf(" 编号为%d的消费者从缓冲池中第%d个缓冲区取出数据%d\n", GetCurrentThreadId(), g_j, g_Buffer[g_j]);SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);if (g_Buffer[g_j] == END_PRODUCE_NUMBER)//结束标志{LeaveCriticalSection(&g_cs);//通知其它消费者有新数据了(结束标志)ReleaseSemaphore(g_hSemaphoreBufferFull, 1, NULL);break;}g_j = (g_j + 1) % BUFFER_SIZE;LeaveCriticalSection(&g_cs);Sleep(50); //some other work to doReleaseSemaphore(g_hSemaphoreBufferEmpty, 1, NULL);}SetConsoleColor(FOREGROUND_GREEN);printf(" 编号为%d的消费者收到通知,线程结束运行\n", GetCurrentThreadId());SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);return 0;}int main(){printf(" 生产者消费者问题 1生产者 2消费者 4缓冲区\n");printf(" — by MoreWindows( ) –\n\n");InitializeCriticalSection(&g_cs);//初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.g_hSemaphoreBufferEmpty = CreateSemaphore(NULL, 4, 4, NULL);g_hSemaphoreBufferFull = CreateSemaphore(NULL, 0, 4, NULL);g_i = 0;g_j = 0;memset(g_Buffer, 0, sizeof(g_Buffer));const int THREADNUM = 3;HANDLE hThread[THREADNUM];//生产者线程hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ProducerThreadFun, NULL, 0, NULL);//消费者线程hThread[1] = (HANDLE)_beginthreadex(NULL, 0, ConsumerThreadFun, NULL, 0, NULL);hThread[2] = (HANDLE)_beginthreadex(NULL, 0, ConsumerThreadFun, NULL, 0, NULL);WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);for (int i = 0; i < THREADNUM; i++)CloseHandle(hThread[i]);//销毁信号量和关键段CloseHandle(g_hSemaphoreBufferEmpty);CloseHandle(g_hSemaphoreBufferFull);DeleteCriticalSection(&g_cs);return 0;}

转载请标明出处,原文地址:

如果觉得本文对您有帮助,请点击‘顶’支持一下,,您的支持是我写作最大的动力,谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

对于沙漠中的旅行者,最可怕的不是眼前无尽的荒漠,而是心中没有绿洲。

秒杀多线程第十篇 生产者消费者问题

相关文章:

你感兴趣的文章:

标签云: