当前位置: 技术问答>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分!!!!!
我的思路是这样的。
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)来指定大小。
老兄捷足先登了啊:)
op_shmptr=shmptr+SHM_SIZE-2;
(*op_shmptr)=buf_semid;
问题是一样地。
to楼主:
最好不要玩这种偏移量的技巧。干脆定义一个结构算了。
获取共享内存时用sizeof(struct_name)来指定大小。