资源简介
经典的操作系统生产者消费者问题,大多数都是控制台实现,我用的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的TCP调试助手源码95706
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- 基于mfc的多线程文件传输
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- MFC数字钟(基于VC6.0)
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- ChartCtrl控件库(可在VS2019中使用)
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
评论
共有 条评论