zoukankan      html  css  js  c++  java
  • 生产者消费者代码

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

    //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放入缓冲区 ", 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 ", 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缓冲区 ");
    printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) -- ");

    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);
    system("pause");
    return 0;
    }

  • 相关阅读:
    Nodejs读取文件时相对路径的正确写法(使用fs模块)
    node 读取多个文件、合并多个文件、读写多个文件
    js中typeof用法详细介绍
    express源码分析之Router
    14 Django的用户认证组件
    13-1 jquery操作cookie
    13 Django组件- cookie与session
    12 Django组件-form组件
    11 Django组件-分页器
    10 Django与Ajax
  • 原文地址:https://www.cnblogs.com/xxiaoye/p/3654966.html
Copyright © 2011-2022 走看看