[问题] semaphore使用的问题

楼主: Zoxge (Zoxge)   2018-05-17 20:07:12
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
小弟是使用thread的新手,想练习一下semaphore的使用
下面连结的程式码
开两个thread,分别跑producer和consumer两支function
Buffer是一个stack架构
producer: 将Buffer的top位置填值,并将stack的top位置往上加
consumer: 将Buffer的top位置填值为0,并将stack的top位置往下减
producer第一次填值为1,每次填值都会是上一次的值+1,直到值加到10000,
两个thread就呼叫 pthread_exit(NULL); 离开,然后程式结束。
因为Buffer的空间有1000格,使用两个semaphore变量: empty与full
producer进入,会将empty-1、full+1,就是放一个东西进Buffer的意思
consumer进入,会将empty+1、full-1,就是从Buffer拿走一个东西的意思
想请问一下
1.Buffer有1000格,一开始都没有放东西,所以对empty与full init的方法是对的吗?
sem_init(&empty, 0, 1000);
sem_init(&full, 0, 0);
2.我也好奇,sem_wait 和 sem_post 要怎么知道Buffer有1000格呢?
要如何让程式知道empty=1000表示Buffer是全空,full=1000表示Buffer是全满呢?
3.另外小弟的code逻辑上是否有什么错误吗?
谢谢
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://ideone.com/MyhKC7 (new)
https://ideone.com/xv22NM (old)
作者: Caesar08 (Caesar)   2018-05-17 23:50:00
top与iNum有data race喔,麻烦用mutex或atomic之类的
作者: djshen (djshen)   2018-05-18 00:59:00
你有跑过吗
楼主: Zoxge (Zoxge)   2018-05-18 08:06:00
有跑过喔 请问哪里有问题呢?我有用mutex保护 pthread_mutex_lock( &mutex1 );请问会有race的原因是哪里呢?
作者: cphe (魔鬼藏在垃圾筒里)   2018-05-18 13:48:00
看起来怪怪的,你的semaphore 定为1000和0就已经定义了buffer的上下限,为何还要各自一个循环做判断是否为空或满一楼指的是你mutex外面有用到shared variable没包到,你取到的值有可能不正确
楼主: Zoxge (Zoxge)   2018-05-18 22:36:00
感谢提醒,我没弄清楚semaphore的用法,那循环的确是多余的另外小弟想到一个问题,当consumer超过一个 (上面new code)有可能发生多个consumer同时等到 sem_wait( &full ); 成立但其实Buffer内资源不足的情况例如producer已经停止产生新资源,而Buffer内只剩1个资源,那就只会有一个consumer能够跑完,其余的consumer只能永远卡在等 sem_wait( &full ); 成立,这样code就跑不完了 @@这种问题该怎么解决呢?
作者: Caesar08 (Caesar)   2018-05-19 12:16:00
semaphore本来就设计成这样,所以卡住很正常要解决这问题,你可以1.自行做semamphore,专门为这种状况处理2.不要用semaphore,改成用mutex,做non-block的query,不过如果想要持续等待,就要自己spin

Links booklink

Contact Us: admin [ a t ] ucptt.com