我正在研究多线程编程,但我遇到了一些问题。
在我的程序中有两个任务和两种类型的机器人来执行这些任务:
任务 1 需要任意两种类型的机器人和
任务 2 需要 2 个机器人 1 类型和 2 个机器人 2 类型。
给出robot1 和robot2 的总数以及指向这两种类型的指针用于初始化。线程共享这些机器人并且机器人被保留,直到线程完成它们。
实际任务是在 doTask1(robot **)
将指向机器人指针的指针作为参数的函数中完成的,因此我需要传递我保留的机器人。我想提供并发。显然,如果我锁定所有内容,它将不会是并发的。robot1 是 Robot ** 的类型。由于它在一个线程调用 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);
}