24小时热门版块排行榜    

查看: 1643  |  回复: 5

wahaha2000

铜虫 (小有名气)

[求助] 请教一个while loop程序的问题

程序的代码如下:


int turn;
boolean flag[2];

do {
     flag=TRUE;
     turn=j;
     while ( flag && turn==j);

         critical section
     
     flag = false;

         remainder section


} while (TRUE);


这是Abraham Siberschatz等写的《操作系统概念(第七版 影印版)》第196页的代码。
我想问的是:语句
while ( flag && turn==j);
有什么作用?我在谭浩强的C语言书和《C语言参考手册》中没找到合适的解答?
非常感谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

【答案】应助回帖

wahaha2000(金币+1): 非常感谢 ! 2011-06-09 22:47:22
这个是系统的互斥锁吧,你用谭浩强教的东西怎么能学到这种东西呃~
flag是一个互斥锁,需要进入临界区的进程都把自己的锁设置为true
这里只假设有两个进程,进程1需要进入临街区时就把自己的开关打开,然后去检查另外一个锁,这里分三种情况:
1.另外一个锁被打开了
2.两个进程同时在竞争,本进程竞争失败
3.本进程竞争成功
只有情况3才进入临界区。情况1是检查flag[ 1 - ture ]为true的情况,情况2是ture不指向 j 的情况。
漩涡的中心有一块空地,空空的。
2楼2011-06-09 19:00:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

推荐把代码放到

【code】
这里
【/code】

其中【】用[]代替

while的那句是等待那些标记变量的变化,使得条件不满足之后再继续执行下面的语句

然而你可能会问,那些变量怎么会变化呢?

比如,其中一个可能是在另外的线程改变了那些变量的值

话说那书我没看过,如果你能给出程序的上下文的话,可能更有利于虫友们进行理解
3楼2011-06-09 19:01:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wahaha2000

铜虫 (小有名气)

非常感谢两位虫友的回答。我想问的是:
这个

【while ( flag && turn==j);】

语句应该是C语言中的,但我看到的两本C语言书(谭浩强的C语言书和《C语言参考手册》)中好像没这种用法,我想能不能给我推荐一本有这种用法的C语言书,我仔细去推敲推敲。

本人学数学的,刚拿了本操作系统书看,问的问题有点初级,非常抱歉!
4楼2011-06-09 21:24:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wahaha2000

铜虫 (小有名气)

再比如下面的代码:

【 while (true)
{
/* produce an item in nextProduced */
while (counter == BUFFER_SIZE) ; /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}  】

其中【while (counter == BUFFER_SIZE) ; 】起什么作用?

(1)若 counter == BUFFER_SIZE 为真,程序怎么运行?

【buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;

还接着运行吗?

(2)若 counter == BUFFER_SIZE 为假,程序怎么运行?

能否给我推荐一本有此内容的参考书,非常感谢!
5楼2011-06-09 22:14:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

引用回帖:
Originally posted by wahaha2000 at 2011-06-09 22:14:41:
再比如下面的代码:

【 while (true)
{
/* produce an item in nextProduced */
while (counter == BUFFER_SIZE) ; /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
c ...

呃,似乎你没有理解我说的【code】【/code】的意思呢

用它们把代码圈起来之后,效果是这样的(中文的【】换成英文的[])
CODE:
while (true)
{
/* produce an item in nextProduced */
while (counter == BUFFER_SIZE) ; /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}

while (counter == BUFFER_SIZE) ;这句是等待counter!=BUFFERSIZE情况的出现~如果一直满足counter == BUFFER_SIZE,这个循环就不停止,一直继续检查~

一旦counter!=BUFFERSIZE了,那么就接着执行下面的代码了
6楼2011-06-09 22:20:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wahaha2000 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 317一志愿华南理工电气工程求调剂 +4 Soliloquy_Q 2026-02-28 5/250 2026-02-28 22:49 by 布什戈们
[考研] 化工专硕348,一志愿985求调剂 +4 弗格个 2026-02-28 6/300 2026-02-28 22:00 by wang_dand
[考研] 292求调剂 +3 yhk_819 2026-02-28 3/150 2026-02-28 21:57 by gaoxiaoniuma
[考研] 290求调剂 +5 材料专硕调剂; 2026-02-28 6/300 2026-02-28 21:40 by gaoxiaoniuma
[考博] 26申博 +4 想申博! 2026-02-26 4/200 2026-02-28 21:37 by limorning
[考研] 264求调剂 +3 巴拉巴拉根556 2026-02-28 3/150 2026-02-28 21:31 by gaoxiaoniuma
[考研] 材料类求调剂 +6 wana_kiko 2026-02-28 6/300 2026-02-28 21:20 by gaoxiaoniuma
[考研] 求调剂 +4 repeatt?t 2026-02-28 4/200 2026-02-28 21:16 by gaoxiaoniuma
[考研] 284求调剂 +4 天下熯 2026-02-28 4/200 2026-02-28 21:13 by gaoxiaoniuma
[考研] 298求调剂 +8 人间唯你是清欢 2026-02-28 11/550 2026-02-28 20:26 by L135790
[基金申请] 面上模板改不了页边距吧? +5 ieewxg 2026-02-25 5/250 2026-02-28 20:11 by iwuli
[考研] 285求调剂 +5 满头大汗的学生 2026-02-28 5/250 2026-02-28 18:10 by 材料专硕调剂;
[考研] 材料调剂 +3 爱擦汗的可乐冰 2026-02-28 3/150 2026-02-28 18:06 by houyaoxu
[高分子] 求环氧树脂研发1名 +3 孙xc 2026-02-25 11/550 2026-02-28 16:57 by ichall
[考研] 265分求调剂不调专业和学校有行学上就 +4 礼堂丁真258 2026-02-28 6/300 2026-02-28 16:18 by 求调剂zz
[考研] 0856调剂 +3 刘梦微 2026-02-28 3/150 2026-02-28 13:22 by houyaoxu
[考研] 304求调剂 +5 曼殊2266 2026-02-28 6/300 2026-02-28 12:44 by 迷糊CCPs
[硕博家园] 博士自荐 +6 科研狗111 2026-02-26 9/450 2026-02-28 12:32 by seaskyy
[考研] 272求调剂 +3 田智友 2026-02-28 3/150 2026-02-28 12:31 by 王加浩to
[基金申请] 面上可以超过30页吧? +12 阿拉贡aragon 2026-02-22 13/650 2026-02-26 22:09 by Hahaxia
信息提示
请填处理意见