loop accept V; end accept; accept P; end accept; end loop;The answer: Yes, it is equivalent to a binary semaphore, if the semaphore is used for mutual exclusion only, after initialization with exactly one call to V. Attempts to use this code to implement more generalized semaphores will quickly run into strange behavior because the V operation can block.
The answer:
procedure tick; critical-section-begin if error > 200 then begin time := time + 10200; error := error - 200; end else if error < -200 then begin time := time + 9800; error := error + 200; end else begin time := time + error; error := 0; end; critical-section-end;Since this is an interrupt service routine, on a uniprocessor, the critical section can be guarded by disabling interrupts. On a multiprocessor, a spin-lock should also be added to lock out changes to error made by other procesors between the time it is inspected in the if statement and the time it is changed.
The answer:
procedure compute_error; const minute = 60000000; { times in usec } var i, count: integer; { clock values } reply_t, start_t, end_t, estimate_t: usec; { time intervals } trip_t, one_error, sum: usec; begin repeat wait(10 * minute); sum := 0; count := 0; for i := 1 to mum_servers do begin start_t := time; send(request_time,server_address[i]); await(reply_t); end_t := time; trip_t := end_t - start_t; if OK(trip_t) then begin estimate_t := start_t + trip_t div 2; one_error := reply_t - estimate_t; count := count + 1; sum := sum + one_error; end; end; begin_critical_section; error := sum div count; end_critical_section; forever; end;