私はマルチスレッドプログラミングに取り組んでおり、何かに行き詰まっています。
私のプログラムには、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);
}