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.