当前位置:  技术问答>linux和unix

300分!查错,解决多个生产者和多个消费者问题 高手进!分不够想法子再加!

    来源: 互联网  发布时间:2015-01-12

    本文导语:  我这份作业是用实际的信号量机制编写的“多个生产者和多个消费者问题”,如果要我要对这份作业做一个描述,很抱歉,我只能说这不是一份让我自己满意的作业,但是我实在没有办法让自己达到进一步的满意。几...

我这份作业是用实际的信号量机制编写的“多个生产者和多个消费者问题”,如果要我要对这份作业做一个描述,很抱歉,我只能说这不是一份让我自己满意的作业,但是我实在没有办法让自己达到进一步的满意。几天来,我花了很多时间编写和调试我的程序,调试占据了大部分时间(我知道这很正常),可是许许多多次调试与验证代码后,都会出现用semget申请的信号量的值会发生丢失现象。
       我的思路是这样的。
        1.init.c完成初始化的工作:
            a.申请共享内存段(shmget)  SHM_SIZE(=20)个整型单元,前十个地址用于生产者与消费者的交互区,后十个单元用于存放程序间共享的变量如shmid,以及交互区的产品数。从尾端开始存放(StackMode)。将shmid写入文件作为共享变量
            我想先不用线程完成 之后再尝试线程上的实现        
    
            b.将最后一个单元存放交互区的产品数,初值为0
            b.创建三个信号量(semget),分别赋初值(semctl),然后分别将三个semid从从共享段最后第二个单元向上顺序存放
    
        2.当前偏移量我通过 shmptr+STORE_SIZE-产品数-1得到
 
        3.Produce.c和Consume.c通过访问文件得到shmid,从而访问共享内存段得到semid。这样就可以对同一信号量进行pv操作,保护临界区。
            a.Produce每次添加后 将产品数+1; Consumer则-1
            b.没有颠倒P操作或V操作
 
        4.View.c文件用于观察交互区的状况。
 
我的代码并不是不值得相信,因为我之前编写了单个文件通过fork然后进行生产者消费者操作 结果完全令人满意 令人鼓舞。我因而希望能写出真正的多个生产者于多个消费者的程序。这四个文件在red-hat7.3下编译无误无警告,但是很容易出现明明有多于0个产品在交互区 可是item_available信号量的值却为零 即使生产者再次存放 对item_available作v操作,可是结果却没有能够在消费者端显示出来,直到交互区满,结果生产者和消费者都sleep了,调试多次 依然如故 苦闷不堪 走投无路啦 : (   55555555555 space_available却不会发生这个现象。所以现在是“单向导通”状态。
        
        我不知道我的描述能否让大家明白我的问题 如果不清楚 可以问我 我的QQ:9856157  我不能排除问题出在我的代码上的可能性,不过消费者和生产者的代码在某种程度上可以说是对称的,而且我检查了好几次。单元不是某个愚蠢到不可原谅的低级错误。
        我一时间在这个问题上觉得找不到方向 花更多的时间得到进展的可能不大了,所以我想向大家请教一下,先人指路可能事半功倍。
        
       代码的大多数地方都已加上尽可能详细的注释了,希望能够说明我的意图。
劳烦有心有识之士替我解开疑惑。

       如果你还愿意从这里看下去的话 我先谢谢了! 如果能办我找出病根,我会另发两贴,加送200分!!!!!

|
to newperson:
老兄捷足先登了啊:)
op_shmptr=shmptr+SHM_SIZE-2;
(*op_shmptr)=buf_semid;
问题是一样地。

to楼主:
最好不要玩这种偏移量的技巧。干脆定义一个结构算了。
获取共享内存时用sizeof(struct_name)来指定大小。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • secureCRT下Linux终端汉字乱码解决方法
  • VS2005解决方案管理器中不显示解决方案节点的解决办法
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 有高手能破解RAR的密码吗,至今没有找到人能解决?(先只给10分意思意思,若解决,至少给解决的人500分!说话算话!)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 解决 select 挡住div的解决方法
  • window.onload事件覆盖掉body onload事件(window.onload和html body onload事件冲突)解决办法
  • 奇怪,怎么“已解决”问题只有4页(10/17日之后的),以前的已解决问题到哪里看?
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 解决!解决!求助如何安装多系统!
  • andriod中UIScrollView无法正常滚动的解决方法
  • 解决多级索引速度慢的问题可否像解决多级页表那样使用TLB?
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • Liunx命令tar压缩出现如下错误该怎么解决?急需解决!感谢
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • 求数据库解决方案===求数据库解决方案
  • windows server2008上PowerBuilder程序系统错误解决方法
  • MYSQL安装时解决要输入current root password的解决方法
  • Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  • 解决oracle用户连接失败的解决方法
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 呵呵,前段时间Ubuntu服务器版的问题总算解决了,解决方法就是重新安装桌面版-_-!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3