Anybody out there know what the term "passing the condition" means? I'm just a little confused about it all and an elaboration on the idea behind would be good. In particular, here's the pseudo code we've been studying that revolves around it. It's based on the Shortest-Job-Next Allocation problem.
monitor SJN {
?bool free = true; # invariant: turn ordered by time && (free -> turn is empty)
?condition_variable turn; # signaled when resource available
?# request the resource
?procedure request(int time) {
? ?if (free)
? ? ?free = false;
? ?else
? ? ?wait(turn, time);
?}
?# release the resource
?procedure release() {
? ?if(empty(turn)) # are there processes waiting on the CV 'turn'?
? ? ?free = true;
? ?else
? ? ?signal(turn);
?}
}
I'm confused about this because consider the case where we're done usingrelease()d decide to release() it.
If there are no proceempty()n the CV (ie.true will return true and the if block will be executed), then we set:
free = true;
Then we don't need to signal. That makes sense.
But coare case where there are processes blocked on the CV?! (ie. those processes are sleeping waiting for it and need to be woken up by the process finishing with the rsignal(turn) calling <empty()).
Well, empty() would return false and the else block would be executed. Here the code says:
signal(turn);
But we haven't reset free yet? So how could another process request the resource and successfully get it? Won't it just be put to sleewait()it'll call wait())since free is still false?
Question
fault
Howdy,
Anybody out there know what the term "passing the condition" means? I'm just a little confused about it all and an elaboration on the idea behind would be good. In particular, here's the pseudo code we've been studying that revolves around it. It's based on the Shortest-Job-Next Allocation problem.
I'm confused about this because consider the case where we're done usingrelease()d decide to release() it.
If there are no proceempty()n the CV (ie.true will return true and the if block will be executed), then we set:
Then we don't need to signal. That makes sense.
But coare case where there are processes blocked on the CV?! (ie. those processes are sleeping waiting for it and need to be woken up by the process finishing with the rsignal(turn) calling <empty()).
Well, empty() would return false and the else block would be executed. Here the code says:
But we haven't reset free yet? So how could another process request the resource and successfully get it? Won't it just be put to sleewait()it'll call wait())since free is still false?
Any clarification would be great.
Edited by faultLink to comment
https://www.neowin.net/forum/topic/363103-concurrent-programming-passing-the-condition/Share on other sites
4 answers to this question
Recommended Posts