• 大小: 1.83MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-09-29
  • 语言: C/C++
  • 标签: c++  mfc  

资源简介

经典的操作系统生产者消费者问题,大多数都是控制台实现,我用的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个文件信息

评论

共有 条评论