0

我正在研究多线程编程,但我遇到了一些问题。

在我的程序中有两个任务和两种类型的机器人来执行这些任务:

  • 任务 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);
}
4

1 回答 1

0

如果机器人是全局资源,线程不应该处理它们。它应该是主线程退出(或清理)功能的职责。此外,还有一种方法可以让线程明确地定位机器人,并锁定它们的使用。

robot1数组似乎存储了机器人,并且它似乎是一个全局数组。然而:

  • 它的访问不受互斥锁 ( pthread_mutex_t) 的保护,现在看来您已经处理好了。

  • 此外,中的代码task1总是在修改条目01这个数组。如果两个或更多线程执行该代码,则条目将被覆盖。我不认为这是你想要的。之后如何使用该数组?

事实上,为什么这个数组需要是全局的?

底线是这样的:只要这个数组被线程共享,它们在并发工作时就会出现问题。这样想:

您有两家公司使用机器人工作,但他们使用同一辆卡车 ( robot1) 来移动机器人。这两家公司应该如何仅用一辆卡车正常高效地运作?

于 2013-03-13T03:33:04.117 回答