生产者和消费者问题

来源:互联网 发布:办公软件2007 编辑:程序博客网 时间:2024/05/20 20:43
#include <stdio.h>
#include <process.h>
#include <windows.h>
int g_Buffer;                        //缓冲区
HANDLE g_hEventBufferEmpty, g_hEventBufferFull;
//生产者线程函数
unsigned int __stdcall ProducerThreadFun(PVOID pM)
{
    for (int i = 1; i <= 100; i++)
    {
        //等待缓冲区为空
        WaitForSingleObject(g_hEventBufferEmpty, INFINITE);
        //互斥的访问缓冲区
        g_Buffer = i;
        printf("生产者将数据%d放入缓冲区\n", i);
        //通知缓冲区有新数据了
        SetEvent(g_hEventBufferFull);
    }   
    return 0;
}
//消费者线程函数
unsigned int __stdcall ConsumerThreadFun(PVOID pM)
{
    for (int i = 1; i <= 100; i++)
    {
        //等待缓冲区中有数据
        WaitForSingleObject(g_hEventBufferFull, INFINITE);
        printf("  消费者从缓冲区中取数据%d\n", g_Buffer);
        //通知缓冲区已为空
        SetEvent(g_hEventBufferEmpty);
        Sleep(10);
    }
    return 0;
}
int main()
{
    //创建二个自动复位事件,一个表示缓冲区是否为空,另一个表示缓冲区是否已经处理
    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);
    return 0;
}
                                             
0 0