One of the distinctions that shows up already is that between system threads, which are preemptible scheduling units, and user threads, which are not. We create the real thing. Observe, that each thread spins on the GO flag. If these were non-preemptible user level threads they may spin here forever while the main thread never gets scheduled to set the flag. The use of the shared GO flag has created a cheap and dirty barrier.
All threads wait on it.
Like the MPI code, the position of a thread in this array is nondeterministic, depending on when they get started. This is a tricky aspect of thread programming. Subtle reorderings may not occur time and time while testing - they still pop up in the real world. You can do some tests to figure it out. You will only be able to test machine scalability to 8 processors.