进程(线程)的同步互斥c语言代码

上传人:子 文档编号:42042195 上传时间:2018-05-31 格式:DOC 页数:8 大小:32.50KB
返回 下载 相关 举报
进程(线程)的同步互斥c语言代码_第1页
第1页 / 共8页
进程(线程)的同步互斥c语言代码_第2页
第2页 / 共8页
进程(线程)的同步互斥c语言代码_第3页
第3页 / 共8页
进程(线程)的同步互斥c语言代码_第4页
第4页 / 共8页
进程(线程)的同步互斥c语言代码_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《进程(线程)的同步互斥c语言代码》由会员分享,可在线阅读,更多相关《进程(线程)的同步互斥c语言代码(8页珍藏版)》请在金锄头文库上搜索。

1、进程进程( (线程线程) )的同步互斥的同步互斥 C C 语言代码语言代码#include #include #include #include #include #include #define MAX_THREAD_NUM 64 /最大线程数#define INTE_PER_SEC 1000 /延迟时间的毫秒值const int SIZE_OF_BUFFER = 10;/缓冲区长度int ProductID = 0;/产品号 int ConsumeID = 0;/将被消耗的产品号 int in = 0;/产品进缓冲区时的缓冲区下标 int out = 0;/产品出缓冲区时的缓冲区下标boo

2、l running=true; /判断程序能否继续执行的逻辑值int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列 HANDLE g_hMutex;/公有信号量,用于线程间的互斥 HANDLE g_hFullSemaphore;/生产者的私有信号量,当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore;/消费者的私有信号量,当缓冲区空时迫使消费者等待 /定义一个结构体用于存储线程的信息struct ThreadInfoint serial; /线程号char entity; /线程类别(生产者或消费者)double delay; /等待时间dou

3、ble persist; /操作时间;/生产者void Producer(void *p) /定义变量用于存储当前线程的信息DWORD m_delay;DWORD m_persist;int m_serial;/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC);while(running)/P 操作coutserial ;m_delay=(DWO

4、RD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC);while(running)/P 操作cout“消费者线程 “m_serial“ 请求消费.“endl;WaitForSingleObject(g_hFullSemaphore,INFINITE);cout“消费者线程 “m_serial“ 请求独占缓冲区.“endl;WaitForSingleObject(g_hMutex,INFINITE); Sleep(m_delay); /延迟等待/从缓冲区中

5、取出一个产品 cout“消费者线程 “m_serial“ 请求取出一个产品.“endl;ConsumeID = g_bufferout;g_bufferout=0;out = (out+1)%SIZE_OF_BUFFER;cout“消费者线程 “m_serial“ 取出产品 “ConsumeID“ 成功.“endl;/消耗一个产品cout“消费者线程 “m_serial“ 开始消费消费产品 “ ConsumeID“.“endl;Sleep(m_persist); cout“消费者线程 “m_serial“ 消费产品 “ ConsumeID“ 成功.“endl; /输出缓冲区当前的状态 cout

6、“*“endl“n 当前缓冲区情况如图: “endl;for (int i=0;iSIZE_OF_BUFFER;+i) if(g_bufferi!=0)cout“;elsecout“;cout“nn*n“endl;/V 操作ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); void prod_cons()/创建互斥信号量 g_hMutex = CreateMutex(NULL,FALSE,NULL); /创建同步信号量g_hEmptySemaphore=CreateSemaphore(NULL,SIZE_OF

7、_BUFFER,SIZE_OF_BUFFER,NULL); g_hFullSemaphore=CreateSemaphore(NULL,0 ,SIZE_OF_BUFFER,NULL);srand(unsigned)time(NULL); /以时间函数为种子const unsigned short THREADS_COUNT = rand()%5+5; /总的线程数(随机生成)/线程对象的数组HANDLE hThreadsMAX_THREAD_NUM;ThreadInfo thread_infoMAX_THREAD_NUM;DWORD thread_ID; /线程 IDint num=0; /临

8、时变量,用于循环语句cout“系统开始模拟,并自动生成模拟数据.“endl;system(“pause“); /暂停确认开始执行cout“线程总数:“THREADS_COUNTendl;/循环随机生成各个线程的信息while(num!=THREADS_COUNT)thread_infonum.serial=num+1;if(rand()%2=1)thread_infonum.entity=P;elsethread_infonum.entity=C;thread_infonum.delay=rand()%5+1;thread_infonum.persist=rand()%6+2;num+;cou

9、t“n 系统生成数据结束,模拟数据如下:“endl“线程号 线程类别 延迟时间 操作时间“endl;for(int x=0;xTHREADS_COUNT;x+)cout“ “thread_infox.serial“t“ “thread_infox.entity“t“ “thread_infox.delay“tt“ “thread_infox.persistendl;cout“nn=生产者-消费者 开始=n“endl;/创建线程for(int i=0;iTHREADS_COUNT;i+)/创建生产者线程if(thread_infoi.entity=P)hThreadsi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),/创建消费者线程elsehThreadsi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),while(running) if(getchar() /按回车后终止程序运行 running = false; cout“系统模拟结束.“endl;void main() cout“n=生产者-消费者 模拟=n“endl;prod_cons();

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号