资源简介
经典的操作系统生产者消费者问题,大多数都是控制台实现,我用的mfc实现了界面操作,结果操作简单易懂。不明白的可以问我-合工大07-3刘俊杰 mylioujunjie@163.com
代码片段和文件信息
// P_C.cpp : Defines the class behaviors for the application.
//
#include “stdafx.h“
#include “P_C.h“
#include “P_CDlg.h“
#ifdef _DEBUG
#define new DEBUG_NEW
#define M 10
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_UPDATEDATA WM_USER + 1
/////////////////////////////////////////////////////////////////////////////
// CP_CApp
BEGIN_MESSAGE_MAP(CP_CApp CWinApp)
//{{AFX_MSG_MAP(CP_CApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP CWinApp::onhelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CP_CApp construction
CP_CApp::CP_CApp()
{
// TODO: add construction code here
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CP_CApp object
CP_CApp theApp;
int in ; // 生产者放置产品的位置
int out; // 消费者取产品的位置
//sem_t empty_sem; // 同步信号量,当满了时阻止生产者放产品
HANDLE empty_sem;
//sem_t full_sem; // 同步信号量,当没产品时阻止消费者消费
HANDLE full_sem;
//pthread_mutex_t mutex; // 互斥信号量, 一次只有一个线程访问缓冲
HANDLE mutex;
int ID_producer;
int ID_consumer;
int buff[M];
CWinThread* pcwinthread1;
CWinThread* pcwinthread2;
CWinThread* pcwinthread3;
CWinThread* ccwinthread1;
CWinThread* ccwinthread2;
CWinThread* ccwinthread3;
CString str_display;
CString str_buff;
UINT Producer( LPVOID pParam ){
//生产者
CP_CDlg* pdlg=(CP_CDlg*)pParam;
int idp = ID_producer ;
CString s1;
CString s2;
while(1)
{
// 用sleep的数量可以调节生产和消费的速度,便于观察
//确认有空缓冲区可供生产,同时将空位置数empty减1;用于生产者和消费者的同步;
WaitForSingleobject(empty_sem-1);
//互斥访问下一个可用于生产的空临界区,实现写写互斥;
WaitForSingleobject(mutex-1);
//这二句如果颠倒的话可能出现一种异常情况
//当进入了缓冲区为满时颠倒之后会对缓冲区先加锁然后进程由于缓冲区为买没法生产产品在这里被阻塞而消费者又无法获得缓冲区的锁进入缓冲区因而会出现死锁
in = in % M;
//printf(“product%d in %d. like: \t“ id in);
s1 =“product“;
s2.Format(“%d“idp);
s1 = s1 + s2;
s2.Format(“%d“in+1);
s1 = s1 + “ in “ + s2 + “\r\n“;
str_display = str_display+s1;
buff[in] = 1;
pdlg->SendMessage(WM_UPDATEDATA);
++in;
ReleaseMutex(mutex);
ReleaseSemaphore(full_sem1NULL);
Sleep(3000);
}
return 0;
}
UINT Consumer( LPVOID pParam ){
//消费者
CP_CDlg* pdlg=(CP_CDlg*)pParam;
int idc = ID_consumer;
CString s2;
CString s1;
while(1)
{
// 用sleep的数量可以调节生产和消费的速度,便于观察
WaitForSingleobject(full_sem-1);
// 这二句如果颠倒的话可能出现一种异常情况
//当进入了缓冲区为空时颠倒之后会对缓冲区先加锁然后进程由于缓冲区为空没发消费产品在这里被阻塞而生产者又无法获得缓冲区的锁进入缓冲区因而会出现死锁
WaitForSingleobject(mutex-1);
out = out % M;
//printf(“prochase%d in %d. like: \t“ id out);
s1 =“consum“;
s2.Format(“%d“idc);
s1 = s1 + s2;
s2.Format(“%d“out+1);
s1 = s1 + “ in “ + s2 + “\r\n“;
str_display = str_displ
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 114770 2010-06-27 14:14 P_C\Debug\P_C.exe
文件 361980 2010-06-27 14:14 P_C\Debug\P_C.ilk
文件 28285 2010-06-27 14:13 P_C\Debug\P_C.obj
文件 5502316 2010-06-26 16:14 P_C\Debug\P_C.pch
文件 410624 2010-06-27 14:14 P_C\Debug\P_C.pdb
文件 3000 2010-06-27 14:11 P_C\Debug\P_C.res
文件 52255 2010-06-27 14:14 P_C\Debug\P_CDlg.obj
文件 105744 2010-06-26 16:14 P_C\Debug\StdAfx.obj
文件 214016 2010-06-27 14:14 P_C\Debug\vc60.idb
文件 372736 2010-06-27 14:14 P_C\Debug\vc60.pdb
文件 36272 2010-06-27 14:06 P_C\P_C.APS
文件 1545 2010-06-27 14:14 P_C\P_C.clw
文件 4605 2010-06-27 13:44 P_C\P_C.cpp
文件 4105 2010-06-26 16:06 P_C\P_C.dsp
文件 514 2010-06-26 16:06 P_C\P_C.dsw
文件 1291 2010-06-26 16:06 P_C\P_C.h
文件 58368 2010-06-27 14:14 P_C\P_C.ncb
文件 54784 2010-06-27 14:14 P_C\P_C.opt
文件 946 2010-06-27 14:14 P_C\P_C.plg
文件 6077 2010-06-27 14:06 P_C\P_C.rc
文件 327 2010-06-27 09:26 P_C\P_C.sln
..A..H. 6656 2010-06-27 09:26 P_C\P_C.suo
文件 12612 2010-06-27 14:14 P_C\P_CDlg.cpp
文件 1790 2010-06-27 14:12 P_C\P_CDlg.h
文件 3525 2010-06-26 16:06 P_C\ReadMe.txt
文件 1078 2010-06-26 16:06 P_C\res\P_C.ico
文件 395 2010-06-26 16:06 P_C\res\P_C.rc2
文件 1095 2010-06-27 13:19 P_C\resource.h
文件 205 2010-06-26 16:06 P_C\StdAfx.cpp
文件 1054 2010-06-26 16:06 P_C\StdAfx.h
............此处省略6个文件信息
- 上一篇:opencv MFC 摄像头 人脸识别
- 下一篇:MFC中B样条绘制
相关资源
- MFC中B样条绘制
- opencv MFC 摄像头 人脸识别
- MFC多边形画法--计算机图形学
- 连连看小游戏(基于简单的MFC)
- MFC界面库 GuiToolKit
- 一个获取磁盘信息MFC
- MFC实现打开外部程序
- 通用杀毒软件VC++源代码
- 数值计算 c代码及简单的MFC界面
- Windows程序设计小游戏捕鱼达人
- 基于c++的m序列的实现方式
- VC6.0+MFC+USBCAN上位机通信控制
- VC++实现Contourlet图像处理
- 用c++实现的抓包并分析协议
- C语言C++常见面试题含答案 (1).pdf
- libstdc++-devel-4.4.6-4.el6.x86_64.rpm
- MC算法C++实现 源代码
- C++课件stl及
- Visual C++ 开发GIS系统 陈建春 配书源代
- Visual C++网络通信编程实用案例精选
- 一个用mfc编写的拼图游戏
- C++程序流程图生成器
- 矢量量化图像压缩编码 vs代码
- MFC制作画板...
- mfc写的仿QQ的聊天软件
- C++ primer中文版
- 最好的C++入门速成教材,1-2天可看完
- C++版AVL树课程设计源代码
- 教你用MFC做计算器
- k-means算法 基于c++语言实现
评论
共有 条评论