procedure main(argc, argv[])
  shared male_enter := semaphore(2)
  shared female_enter := semaphore(2)
  shared pairs := barrier(4)
  shared capacity := semaphore(2 * integer(argv[1]))
  shared const min_dance := integer(argv[2])

  while read genre do
    case genre of
      'M': create_thread(male)
      'W': create_thread(female)
    end case
  end while
end procedure

procedure male()
  declare danced_minutes := 0
  while danced_minutes < min_dance do
    wait(male_enter)
    wait(pairs)
    wait(capacity)
    signal(male_enter)
    danced_minutes += dance()
    signal(capacity)
  end while
end procedure

procedure female()
  declare danced_minutes := 0
  while danced_minutes < min_dance do
    wait(female_enter)
    wait(pairs)
    wait(capacity)
    signal(female_enter)
    danced_minutes += dance()
    signal(capacity)
  end while
end procedure
