taskc/relay_race/{given → design}/relay_race.pseudo RENAMED
@@ -1,27 +1,42 @@
1
  procedure main(argc, argv[]):
2
  if argc = 4 then
3
  shared team_count := integer(argv[1])
4
  shared stage1_delay := integer(argv[2])
5
  shared stage2_delay := integer(argv[3])
6
  shared position := 0
7
 
 
 
 
 
8
  for team := 0 to team_count do
9
  create_thread(run_stage1, team)
10
  create_thread(run_stage2, team)
11
  end for
12
  else
13
  print "usage: relay_race team_count stage1_delay stage2_delay"
14
  end if
15
  end procedure
16
 
17
  procedure run_stage1(team_number):
 
 
 
18
  delay(stage1_delay)
 
 
19
  end function
20
 
21
  procedure run_stage2(team_number):
 
 
 
22
  delay(stage2_delay)
 
 
23
  declare constant my_team_position = ++position
24
  if my_team_position <= 3 then
25
  print('Place ', my_team_position, ': team ', team_number)
26
  end if
 
27
  end procedure
1
  procedure main(argc, argv[]):
2
  if argc = 4 then
3
  shared team_count := integer(argv[1])
4
  shared stage1_delay := integer(argv[2])
5
  shared stage2_delay := integer(argv[3])
6
  shared position := 0
7
 
8
+ shared start_barrier := create_barrier(team_count)
9
+ shared batons := create_semaphores(team_count, 0)
10
+ shared finish_mutex := create_mutexes(1)
11
+
12
  for team := 0 to team_count do
13
  create_thread(run_stage1, team)
14
  create_thread(run_stage2, team)
15
  end for
16
  else
17
  print "usage: relay_race team_count stage1_delay stage2_delay"
18
  end if
19
  end procedure
20
 
21
  procedure run_stage1(team_number):
22
+ // Wait until all teams are ready
23
+ wait(start_barrier)
24
+ // Run the first stage
25
  delay(stage1_delay)
26
+ // Relay the baton to its partner
27
+ signal(baton[team_number])
28
  end function
29
 
30
  procedure run_stage2(team_number):
31
+ // Wait until my peer relays the baton to me
32
+ wait(baton[team_number])
33
+ // Run the second stage
34
  delay(stage2_delay)
35
+ // Claim our prize
36
+ wait(finish_mutex)
37
  declare constant my_team_position = ++position
38
  if my_team_position <= 3 then
39
  print('Place ', my_team_position, ': team ', team_number)
40
  end if
41
+ signal(finish_mutex)
42
  end procedure