コード例 #1
0
        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();
                }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
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));
 }