Download pseudo source code

procedure main()
  // How many threads have arrived to the barrier
  shared count := 0
  // Protects the increment of the count
  shared can_access_count := create_semaphore(1)
  // Locked (0) until all threads arrive, then it is unlocked (1)
  shared turnstile1 := create_semaphore(0)
  shared turnstile2 := create_semaphore(1)
  // Read thread count from standard input
  input shared const thread_count
  // Create a thread team running secondary
  create_threads(thread_count, secondary)
end procedure

procedure secondary()
  while true do
    Statement A

    // Adapt rendezvous solution here
    wait(can_access_count)
      count := count + 1
      if count = thread_count then
        wait(turnstile2)
        signal(turnstile1)
      end if
    signal(can_access_count)
    wait(turnstile1)
    signal(turnstile1)

    // Statement B can be only executed until all threads have run Statement A
    Statement B

    // Adapt rendezvous solution here
    wait(can_access_count)
      count := count - 1
      if count = 0 then
        wait(turnstile1)
        signal(turnstile2)
      end if
    signal(can_access_count)
    wait(turnstile2)
    signal(turnstile2)

  end while
end procedure