2016-05-11 4 views
0

platform.xmlファイルでホストの機能の存在を宣言された二つのタスク:SimGrid。同時受信

<host id="Tier1_1" core="2" speed="100f"/>

workerプロセスがこのホストに住んでいます。 作業者は2つのタスクを同時に受信して実行できます(コア数が2の場合)。 私はこのようなコードを使用しますが、この場合は動作しません(このコードは同時に2つのタスクを受け取ることはできません)。

while(true) { 
    commReceived = Task.irecv("Tier1_" + num); 
    commReceived.waitCompletion(); 
    if (commReceived.test()){ 
     task = commReceived.getTask(); 
     commReceived = null; 
     Msg.info("Receive " + task.getName()); 
     task.execute(); 
     Msg.info("End to execute " + task.getName()); 
    } 

UPD

今、私はこのコードを使用します。同じメールボックス "Tier1_2"を持つ2つのプロセスがあります。私は、メールボックス( "Tier1_2")にisendで送信します。

for (int j=0; j<2; j++){ 
     Process process = new Process(getHost().getName(), "Tier1_2_" + j) { 
      @Override 
      public void main(String[] strings) throws MsgException { 
       while (true){ 
        commReceived = Task.irecv("Tier1_2"); 
        commReceived.waitCompletion(); 
        if (commReceived.test()){ 
         task = commReceived.getTask(); 
         commReceived = null; 
         Msg.info("Receive " + task.getName()); 
         } 
       } 
      } 
     };process.start(); 

    } 

しかし、それは与える:

Exception in thread "Thread-5" java.lang.NullPointerException 
    at LHCb.Tier1$1.main(Tier1.java:46) 
    at org.simgrid.msg.Process.run(Process.java:338) 

私はプロセスを宣言する必要がありますどのように正しく?

+0

何が問題なのですか?あなたが受け取ったエラーを表示できますか? –

答えて

1

アイデアは、異なるメールボックスで待機する他のプロセスを起動するワーカープロセスを持つことです。プロセスが実行されているホストの名前、およびプロセス自体の名前:(私がテストしていない)のようなインスタンス何か

for (int i = 0; i < 2; i++) { 
    Process p = new Process(getHost.getName(), "Tier1_" + i) { 
     public void main(String[] args) throws MsgException { 
     String mailbox = getName(); 
     while(true) { 
      commReceived = Task.irecv(mailbox); 
      commReceived.waitCompletion(); 
      if (commReceived.test()){ 
      task = commReceived.getTask(); 
      commReceived = null; 
      Msg.info("Receive " + task.getName()); 
      task.execute(); 
      Msg.info("End to execute " + task.getName()); 
      } 
     } 
     }); 
     p.start(); 
} 

のための新しいプロセス()メソッドは2つの引数を取ります。ここでは、メールボックス名(したがってmailbox = getName())として使用される一意のプロセス名を宣言します。

これらのプロセスは、いつの間にか終了するのを忘れないようにしてください。そのため、生成されたすべてのプロセスをベクターに入れて、簡単にすることができます。

+0

私は質問を更新しました。 –

関連する問題