• 生产者消费者问题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
  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/JT-L/p/3756396.html
Copyright © 2020-2023  润新知