0

私はマルチスレッドプログラミングに取り組んでおり、何かに行き詰まっています。

私のプログラムには、2 つのタスクと、タスクを実行するための 2 種類のロボットがあります。

  • タスク 1 には、任意の 2 種類のロボットと

  • タスク 2 には、2 つの robot1 タイプと 2 つの robot2 タイプが必要です。

robot1 と robot2 の総数と、これら 2 つのタイプへのポインタが初期化のために与えられます。スレッドはこれらのロボットを共有し、ロボットはスレッドが完了するまで予約されます。

実際のタスクは doTask1(robot **)、ロボット ポインターへのポインターをパラメーターとして受け取る関数で実行されるため、予約したロボットを渡す必要があります。並行性を提供したい。明らかに、すべてをロックすると、同時実行されなくなります。robot1 はロボット ** のタイプです。1 つのスレッドが doTask を呼び出す前または終了する前にすべてのスレッドで使用されるため、別のスレッドが robot1 を上書きして変更を加えることができます。robot1 がすべてのスレッドで共有されているためです。この問題を解決するにはどうすればよいか説明していただけますか? スレッド開始ルーチンに引数を渡したくありません。

rsc初期化関数で指定されたロボットとポインターの数を保持する私の構造体です。

void *task1(void *arg)
{
    int tid;
    tid = *((int *) arg);
    cout << "TASK 1 with thread id " << tid << endl;

    pthread_mutex_lock (&mutexUpdateRob);
    while (rsc->totalResources < 2)
    {
        pthread_cond_wait(&noResource, &mutexUpdateRob);
    }

    if (rsc->numOfRobotA > 0 && rsc->numOfRobotB > 0)
    {
        rsc->numOfRobotA --;
        rsc->numOfRobotB--;
        robot1[0] = &rsc->robotA[counterA];
        robot1[1] = &rsc->robotB[counterB];
        counterA ++;
        counterB ++;
        flag1 = true;
        rsc->totalResources -= 2;
    }

     pthread_mutex_unlock (&mutexUpdateRob);
     doTask1(robot1);

     pthread_mutex_lock (&mutexUpdateRob);

     if(flag1)
     {
         rsc->numOfRobotA ++;
         rsc->numOfRobotB++;
         rsc->totalResources += 2;
      }

       if (totalResource >= 2)
       {
           pthread_cond_signal(&noResource);
       }
       pthread_mutex_unlock (&mutexUpdateRob);

       pthread_exit(NULL);
}
4

1 に答える 1

0

ロボットがグローバル リソースである場合、スレッドはロボットを破棄しないでください。これは、メイン スレッドの終了 (またはクリーンアップ) 関数の役割です。また、スレッドがロボットを明確に特定し、その使用をロックする方法が必要です。

配列はrobot1ロボットを格納しているようで、グローバル配列のようです。でも:

  • そのアクセスはミューテックス ( pthread_mutex_t) によって保護されていません。

  • また、コードtask1は常にエントリ01この配列を変更しています。2 つ以上のスレッドがそのコードを実行すると、エントリが上書きされます。それがあなたの望むものだとは思いません。その配列はその後どのように使用されますか?

実際、なぜこの配列はグローバルである必要があるのでしょうか?

肝心なのは、この配列がスレッドによって共有されている限り、それら同時に動作する際に問題が発生するということです。次のように考えてください。

作業にロボットを使用している 2 つの会社がありますがrobot1、ロボットの移動には同じトラック ( ) を使用しています。この 2 つの会社が、たった 1 台のトラックで適切かつ効率的に機能するにはどうすればよいでしょうか?

于 2013-03-13T03:33:04.117 に答える