public void registerWaitingSet(AutoResetEvent waiting_set) { waiting_request = new Thread(new ThreadStart(delegate { while (true) { initial_signal.WaitOne(); internal_request.Wait(); lock (wait_lock) { completed = true; foreach (AutoResetEvent ws in waiting_sets) { ws.Set(); } } } })); waiting_request.Start(); lock (wait_lock) { if (completed) { waiting_set.Set(); } else { waiting_sets.Add(waiting_set); initial_signal.Set(); } } }
public override int go() { int i, j, ny2; ny2 = ny + 2; if (jfin1 == ny) { double[] dum = new double[2 * nx]; MPI.Request msgid3 = worldcomm.ImmediateReceive <double>(east, from_e, dum); msgid3.Wait(); for (i = 1; i <= nx; i++) { g[ny + 1, i] = dum[i - 1]; h[ny + 1, i] = dum[i + nx - 1]; } } if (jbeg == 1) { double[] dum; dum = new double[2 * nx]; for (i = 1; i <= nx; i++) { dum[i - 1] = g[1, i]; dum[i + nx - 1] = h[1, i]; } worldcomm.Send <double>(dum, west, from_e); } if (ifin1 == nx) { double[] dum; dum = new double[2 * ny2]; MPI.Request msgid1 = worldcomm.ImmediateReceive <double>(south, from_s, dum); msgid1.Wait(); for (j = 0; j <= ny + 1; j++) { g[j, nx + 1] = dum[j]; h[j, nx + 1] = dum[j + ny2]; } } if (ibeg == 1) { double[] dum; dum = new double[2 * ny2]; for (j = 0; j <= ny + 1; j++) { dum[j] = g[j, 1]; dum[j + ny2] = h[j, 1]; } worldcomm.Send <double>(dum, north, from_s); } return(0); }
/// <summary> /// Wait until this non-blocking operation has completed. /// </summary> /// <returns> /// Information about the completed communication operation. /// </returns> public CompletedStatus Wait() { MPI.CompletedStatus internal_status = internal_request.Wait(); return(CompletedStatus.createStatus(internal_status, source)); }