zoukankan      html  css  js  c++  java
  • 生产者消费者问题c语言实现

     1 #include <stdio.h>
     2 #include <process.h>
     3 #include <Windows.h>
     4 //信号量与关键段
     5 CRITICAL_SECTION g_cs;
     6 HANDLE Empty,Full;
     7 
     8 const int BUFFER_SIZE=10;//10个缓冲池
     9 const int numofp=2;//生产者线程数
    10 const int numofc=2;//消费者线程数
    11 const int numofpr=100;//要生产的产品数
    12 int buffer[BUFFER_SIZE];
    13 int pf=0,pe=0;
    14 int count=1;
    15 int count_c=1;
    16 int mp=0;
    17 
    18 //生产者
    19 unsigned int __stdcall Producer(PVOID p){
    20 
    21     while(true){
    22         //等待有空的缓冲区出现
    23         WaitForSingleObject(Empty, INFINITE);
    24         //互斥的访问缓冲区
    25         EnterCriticalSection(&g_cs);
    26         if(count>numofpr){
    27             LeaveCriticalSection(&g_cs);
    28             ReleaseSemaphore(Full,1,NULL);
    29             break;
    30         }
    31         buffer[pe]=++mp;
    32         //printf("%d,",*((int *)p));
    33         printf("编号为%d的生产者从第%d个空缓冲池中写入数据%d
    ",*((int *)p),pe,buffer[pe]);
    34         pe=(pe+1)%BUFFER_SIZE;
    35         count++;
    36         LeaveCriticalSection(&g_cs);
    37         //通知消费者有新数据了
    38         ReleaseSemaphore(Full,1,NULL);
    39     }
    40     return 0;
    41 }
    42 //消费者
    43 unsigned int __stdcall Consumer(PVOID p){
    44         
    45     while(true){
    46             WaitForSingleObject(Full,INFINITE);
    47             EnterCriticalSection(&g_cs);
    48             if(count_c>numofpr){
    49                 LeaveCriticalSection(&g_cs);
    50                 ReleaseSemaphore(Empty,1,NULL);
    51                 break;
    52             }
    53             //printf("%d,",*((int *)p));
    54             printf("    编号为%d的消费者从第%d个FULL缓冲区中取出数据%d
    ",*((int *)p),pf,buffer[pf]);
    55             pf=(pf+1)%BUFFER_SIZE;
    56             count_c++;
    57             LeaveCriticalSection(&g_cs);
    58             ReleaseSemaphore(Empty,1,NULL);
    59         }
    60             return 0;
    61 }
    62 
    63 int main(){
    64     printf("  生产者消费者问题:%d生产者-%d消费者-%d缓冲区-%d个产品
    
    ",numofp,numofc,BUFFER_SIZE,numofpr);
    65     InitializeCriticalSection(&g_cs);//初始化一个临界区对象
    66     //初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.
    67     Empty=CreateSemaphore(NULL,10,10,NULL);
    68     Full=CreateSemaphore(NULL,0,10,NULL);
    69     const int THREADNUM=numofc+numofp;//线程数
    70     HANDLE hThread[THREADNUM];
    71     //生产者线程
    72     int a=1,b=2,c=3,d=4;
    73     hThread[0]=(HANDLE)_beginthreadex(
    74         NULL,//安全属性,NULL为默认安全属性
    75         0,//指定线程堆栈的大小,一般为0
    76         Producer,//指定线程函数的地址
    77         &a,//传递给线程的参数的指针
    78         0,//线程初始状态,0:立即运行
    79         NULL);//用于记录线程ID的地址
    80 
    81     hThread[1]=(HANDLE)_beginthreadex(NULL,0,Producer,&b,0,NULL);
    82 
    83     hThread[2]=(HANDLE)_beginthreadex(NULL,0,Consumer,&c,0,NULL);
    84     
    85     hThread[3]=(HANDLE)_beginthreadex(NULL,0,Consumer,&d,0,NULL);
    86     WaitForMultipleObjects(THREADNUM, hThread, TRUE, INFINITE);
    87     for (int i = 0; i < THREADNUM; i++)
    88         CloseHandle(hThread[i]);
    89 
    90     //销毁信号量和关键段
    91     CloseHandle(Empty);
    92     CloseHandle(Full);
    93     DeleteCriticalSection(&g_cs);
    94     system("pause");
    95 
    96     return 0;
    97 }
    View Code
  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/JT-L/p/3756396.html
Copyright © 2011-2022 走看看