Y must be a simple array of thread numbers.
If Y is a simple scalar, R is an array, the result (if any) of the thread.
If Y is a simple non-scalar, R has the same shape as Y, and result is an array of enclosed thread results.
dup←{⍵ ⍵} ⍝ Duplicate ⎕←dup&88 ⍝ Show thread number 11 88 88 ⎕TSYNC dup&88 ⍝ Wait for result 88 88 ⎕TSYNC,dup&88 88 88 ⎕TSYNC dup&1 2 3 1 2 3 1 2 3 ⎕TSYNC dup&¨1 2 3 1 1 2 2 3 3
The interpreter detects a potential deadlock if a number of threads wait for each other in a cyclic dependency. In this case, the thread that attempts to cause the deadlock issues error number 1008: DEADLOCK.
⎕TSYNC ⎕TID ⍝ Wait for self DEADLOCK ⎕TSYNC ⎕TID ^ ⎕EN 1008
If any item of Y does not correspond to the thread number of an active thread, or if any subject thread terminates without returning a result, then ⎕TSYNC does not return a result. This means that, if the calling context of the ⎕TSYNC requires a result, for example: rslt←⎕TSYNC tnums, a VALUE ERROR will be generated. This situation can occur if threads have completed before ⎕TSYNC is called.
⎕←÷&4 ⍝ thread (3) runs and terminates. 3 0.25 ⎕TSYNC 3 ⍝ no result required: no prob ⎕←⎕tsync 3 ⍝ context requires result VALUE ERROR ⎕←⎕tsync {}&0 ⍝ non-result-returning fn: no result. VALUE ERROR
Coding would normally avoid such an inconvenient VALUE ERROR either by arranging that the thread-spawning and ⎕TSYNC were on the same line:
rslt ← ⎕TSYNC myfn&¨ argvec
or
tnums←myfn&¨ argvec ⋄ rslt←⎕TSYNC tnums
or by error-trapping the VALUE ERROR.