Download pseudo source code

procedure main(argc, argv[]):
  if argc = 4 then
    shared team_count := integer(argv[1])
    shared stage1_delay := integer(argv[2])
    shared stage2_delay := integer(argv[3])
    shared position := 0

    shared start_barrier := create_barrier(team_count)
    shared batons := create_semaphores(team_count, 0)
    shared finish_mutex := create_mutexes(1)

    for team := 0 to team_count do
      create_thread(run_stage1, team)
      create_thread(run_stage2, team)
    end for
  else
    print "usage: relay_race team_count stage1_delay stage2_delay"
  end if
end procedure

procedure run_stage1(team_number):
  // Wait until all teams are ready
  wait(start_barrier)
  // Run the first stage
  delay(stage1_delay)
  // Relay the baton to its partner
  signal(baton[team_number])
end function

procedure run_stage2(team_number):
  // Wait until my peer relays the baton to me
  wait(baton[team_number])
  // Run the second stage
  delay(stage2_delay)
  // Claim our prize
  wait(finish_mutex)
    declare constant my_team_position = ++position
    if my_team_position <= 3 then
      print('Place ', my_team_position, ': team ', team_number)
    end if
  signal(finish_mutex)
end procedure