1

マルチスレッド アプリケーションで MPI を使用しようとしています。メイン スレッドで、MPI 環境を初期化し、Manager オブジェクトを作成します。Manager オブジェクトは、オブジェクトを受信するための 1 つと GUI スレッドの 2 つの追加のスレッドを開始します。ユーザーが送信ボタンをクリックするたびに、オブジェクトが対応するランクに送信されることになっています。この操作が成功することもありますが、次のエラーが発生する場合があります。

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
      at MPI.Unsafe.MPI_Recv(IntPtr buf, Int32 count, Int32 datatype, Int32 source, Int32 tag, Int32 comm, MPI_Status& status)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value, CompletedStatus& status)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag)

コード:

public Manager(String managerID)
{
        //other actions...
        (new Thread(new ThreadStart(startGUIThread))).Start();
        ReceiverThread = new Thread(new ThreadStart(MachineReceiver));
        ReceiverThread.Start();
}
public void MachineReceiver()
{
        while (IsRunning)
        {
            System.Console.Out.WriteLine("initiated");
            Data data = Communicator.world.Receive<Data>(source, 100);
            System.Console.Out.Write("Received");
        }
}
4

1 に答える 1

0

MPI_Init() で MPI を初期化しましたか? もしそうなら、それはマルチスレッドプログラムにとって間違っています。代わりに MPI_Init_thread() を使用する必要があります。http://www.mpi-forum.org/docs/mpi-20-html/node165.htmを参照してください。

于 2012-05-07T09:19:28.823 に答える