procedure main(argc, argv[])
shared thread_count := integer(argv[1])
shared can_greet as array of thread_count semaphores
for thread_number := 0 to thread_count do
can_greet[thread_number] := create_semaphore(not thread_number)
create_thread(greet, thread_number) // thread team
end for
print "Hello from main thread"
end procedure
procedure greet(thread_number)
wait(can_greet[thread_number])
print "Hello from secondary thread", thread_number, " of ", thread_count
signal(can_greet[(thread_number + 1) mod thread_count])
end procedure