CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

大家帮我找下错误,做了好几天了,也不知错在哪儿

楼主tonysjwang(青蛙王子)2003-11-02 10:37:52 在 C/C++ / C语言 提问

 
                                                                                      //实验6:生产者与消费者问题  
   
  生产者-消费者问题(producer-consumer   problem)是指若干进程通过有限的共享缓冲区交换数据时的缓冲区资源使用问题。假设“生产者“进程不断向共享缓冲区写入数据(即生产数据),而“消费者“进程不断从缓冲区读出数据(即消费数据);共享缓冲区共有n个;任何时刻只能有一个进程可对共享缓冲区进行操作。所有生产者和消费者之间要协调,以完成对共享缓冲区的操作。  
  //************************************************************************************************      
  #include   <iostream.h>  
  #include   <windows.h>  
  #include   <fstream.h>  
  #define     count   5  
   
  struct   threadinfo               //定义线程信息结构  
  {  
  int   threadnum;//   线程序号  
  char   pc;//   线程类别  
  int   persist;//   生产/消费用时  
  };  
   
  threadinfo   newThread[5]={{1,'p',3},{2,'p',4},{3,'c',4},{4,'p',2},{5,'c',2}};//写入五个线程的信息  
                                                                       
  HANDLE   MutexOfPandC;   //互斥器,用于控制在任何时刻只能有一个线程可对共享  
  //缓冲区进行操作  
  HANDLE   SemaphoreOfPandC;//   同步信号量  
  HANDLE   hthread[count];//   线程句柄  
   
  int   number=0;//缓冲区数量,初值赋为0    
  DWORD   dwthreadid;  
  int   dwthrdparam=1,i;  
  //   ***********************************************************************  
   
  DWORD   WINAPI   Pthreadfunc(LPVOID   n)//生产者线程函数  
  {  
   
  threadinfo   p=*(threadinfo*)n;  
         
   
          cout<<"线程"<<p.threadnum<<"申请进入缓冲区"<<endl;  
  cout<<endl;  
          while(1)  
  {  
  if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)  
  //为真,生产者线程有可能进入  
  {  
      if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)  
  //若为真,进入缓冲区  
  {  
      cout<<"线程"<<p.threadnum<<"进入缓冲区"<<endl;  
  cout<<endl;  
   
      Sleep(p.persist*1000);  
   
      cout<<"线程"<<p.threadnum<<"离开缓冲区"<<endl;  
  cout<<endl;  
  }  
  else//   否则释放互斥器,让其它线程进入  
          {ReleaseMutex(MutexOfPandC);}  
   
  ReleaseMutex(MutexOfPandC);//   释放互斥器  
     
                    CloseHandle(hthread[p.threadnum]);//   关闭线程句柄  
  }  
          return   1;  
  }  
  }  
    //***********************************************************************    
  DWORD   WINAPI   Cthreadfunc(LPVOID   n)//消费者线程函数  
  {  
            threadinfo   p=*(threadinfo*)n;  
         
    cout<<"线程"<<p.threadnum<<"申请进入缓冲区"<<endl;  
    cout<<endl;  
    while(1)  
    {  
  if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)  
  //   若为真,消费者线程有可能进入  
  {  
      if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)  
  //若为真,进入缓冲区  
          {  
    cout<<"线程"<<p.threadnum<<"进入缓冲区"<<endl;  
    cout<<endl;  
     
    Sleep(p.persist*1000);  
     
    cout<<"线程"<<p.threadnum<<"离开缓冲区"<<endl;  
    cout<<endl;  
        }  
    else//   否则释放互斥器,让其它线程进入  
    {ReleaseMutex(MutexOfPandC);}  
   
    ReleaseSemaphore(SemaphoreOfPandC,1,0);//释放信号量,信号量加1    
    ReleaseMutex(MutexOfPandC);//   释放互斥器  
     
    CloseHandle(hthread[p.threadnum]);//   关闭线程句柄  
    }  
        return   1;  
    }  
  }  
   
  //***********************************************************************8  
  void   main()  
  {  
      MutexOfPandC=CreateMutex(NULL,false,NULL);//创建互斥器    
      SemaphoreOfPandC=CreateSemaphore(NULL,0,5,NULL);//创建信号量,当前值为0,最大值为5    
   
      ofstream   myf1("e:\\class\\操作系统与系统编程\\作业\\PandC\\PandCProblem.txt");  
       
      for(i=0;i<5;i++)//多线程函数  
      {        
        myf1<<newThread[i].threadnum<<"       "<<newThread]i].pc<<"       "  
        <<newThread[i].persist<<endl;  
        cout<<"线程"<<newThread[i].threadnum<<"为   "<<newThread[i].pc  
          <<"申请进入缓冲区;"<<"在缓冲区访问   "<<newThread   [i].persist<<"秒"<<endl;    
              cout<<endl;  
       
          if(newThread[i].pc=='P')//创建生产者线程  
  {  
      hthread[i]=CreateThread(NULL,0,Pthreadfunc,&newThread[i],0,&dwthreadid);  
      }  
          if(newThread[i].pc=='C')//创建消费者线程  
      {  
      hthread[i]=CreateThread(NULL,0,Cthreadfunc,&newThread[i],0,&dwthreadid);  
      }    
    }cin.get();  
       
  }  
  问题点数:0、回复次数:10Top

1 楼leyt(思维机器)回复于 2003-11-02 11:09:41 得分 0

myf1<<newThread[i].threadnum<<"       "<<newThread]i].pc<<"       "    
  中]i]写错了,应为[i]  
  Top

2 楼liuxueliuxue(peifu)回复于 2003-11-02 12:16:45 得分 0

有错误信息吗?大家又不是都是高手,肉眼看完要很长时间那。你应该到操作系统那里去问更好,这里都是初雪c\c+,你不是难为大家吗。我对这些也是不懂,不过你的生产者对HANDLE   SemaphoreOfPandC;//   同步信号量好象没有操作,消费着每次+1,生产者应该-1把,  
   
   
  还有共享缓冲区共有n个;任何时刻只能有一个”线程“可对共“享缓冲区”进行操作,是不是对n个缓冲区总称,还,,  
   
  我也不懂,随便乱说的。Top

3 楼tonysjwang(青蛙王子)回复于 2003-11-02 13:09:31 得分 0

应该是存在死锁问题.  
  生产者在进入缓冲区后,同步信号量已减1.  
  任何时刻只能有一个”线程“可对“共享缓冲区”进行操作,是对n个缓冲区总称.Top

4 楼mintwlf(Programmer)回复于 2003-11-02 13:33:05 得分 0

信号量和互斥器只能用一个!  
  Top

5 楼tonysjwang(青蛙王子)回复于 2003-11-02 19:35:32 得分 0

我认为应该用两个,互斥器用于控制每次只有一个线程访问缓冲区.信号量用于保护对缓冲区的非法修改.我这个程序的错误就在于发生了死锁.可我找不到问题出在那里.Top

6 楼ljt198199(罗xxx)回复于 2003-11-02 21:35:00 得分 0

靠,你还得我肉眼看得红肿!!再看一下就要去配眼镜了!!Top

7 楼liuxueliuxue(peifu)回复于 2003-11-03 12:07:52 得分 0

WaitForSingleObject(SemaphoreOfPandC,0)这个喊说有什么功能,能阻塞线程吗?如果可以,那末这个程序就一定回有死锁。Top

8 楼liuxueliuxue(peifu)回复于 2003-11-03 17:42:30 得分 0

if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0) //有没有空间  
   
  {  
      if(WaitForSingleObject(MutexOfPandC,INFINITE)==WAIT_OBJECT_0)//有无       线程  
   
  这样也许可以,。。。。  
   
   
   
  ------我是来看的,不是解题的Top

9 楼tonysjwang(青蛙王子)回复于 2003-11-03 18:46:31 得分 0

if(WaitForSingleObject(SemaphoreOfPandC,0)==WAIT_OBJECT_0)  
  //有无缓冲区可用,若有则进入,若无则释放互斥器,以便于其它线程进入.  
   
   
  Top

10 楼tonysjwang(青蛙王子)回复于 2003-11-04 16:25:46 得分 0

upTop

相关问题

  • 错误在哪儿?
  • 不知名的错误!!!!
  • ftp错误,不知何故?
  • 请教:不知道错误!
  • 不知道为什么的错误?
  • 一个错误不知怎么解决?
  • 错误连篇,不知错在哪里!
  • 不知道是什么错误?
  • 真是不知道那有错误
  • java.lang.NullPointerException错误不知什么问题

关键词

  • 线程
  • 数据
  • 消费者
  • 缓冲区
  • 生产者
  • threadinfo
  • 共享
  • 进程
  • 操作
  • 问题

得分解答快速导航

  • 帖主:tonysjwang

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo