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