Multithreading 提供Pthreads之间的并发性

Multithreading 提供Pthreads之间的并发性,multithreading,concurrency,posix,Multithreading,Concurrency,Posix,我正在进行多线程编程,我被困在了一些东西上 在我的程序中,有两个任务和两种类型的机器人来执行这些任务: 任务1需要任意两种类型的机器人和 任务2需要2个机器人1型和2个机器人2型 为初始化提供了robot1和robot2的总数以及指向这两种类型的指针。线程共享这些机器人,机器人被保留,直到线程完成 实际任务在doTask1(robot**)函数中完成,该函数将指向机器人指针的指针作为参数,因此我需要传递我保留的机器人。我想提供并发性。显然,如果我锁定所有内容,它将不会并发。robot1是一种

我正在进行多线程编程,我被困在了一些东西上

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

  • 任务1需要任意两种类型的机器人和

  • 任务2需要2个机器人1型和2个机器人2型

为初始化提供了robot1和robot2的总数以及指向这两种类型的指针。线程共享这些机器人,机器人被保留,直到线程完成

实际任务在
doTask1(robot**)
函数中完成,该函数将指向机器人指针的指针作为参数,因此我需要传递我保留的机器人。我想提供并发性。显然,如果我锁定所有内容,它将不会并发。robot1是一种机器人**。因为它在一个线程调用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);
}
void*task1(void*arg)
{
国际贸易署;
tid=*((int*)arg);
cout 0和&rsc->numorbotb>0)
{
rsc->numOfRobotA--;
rsc->numOfRobotB--;
机器人1[0]=&rsc->robotA[counterA];
机器人1[1]=&rsc->机器人B[counterB];
计数器A++;
计数器B++;
flag1=真;
rsc->totalResources-=2;
}
pthread_mutex_unlock(&mutexUpdateRob);
doTask1(机器人1);
pthread_mutex_lock(&mutexUpdateRob);
如果(标志1)
{
rsc->numOfRobotA++;
rsc->numorbotb++;
rsc->totalResources+=2;
}
如果(总资源>=2)
{
pthread_cond_信号(&noResource);
}
pthread_mutex_unlock(&mutexUpdateRob);
pthread_exit(NULL);
}

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

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

  • 它的访问不受互斥锁的保护(
    pthread\u mutex\u t
    ),现在看来您已经处理好了

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

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

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


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

您能更好地格式化代码吗?很难理解它的显示方式。它不允许我使用缩进,这就是为什么它是这样的。什么不喜欢你使用缩进?所以当然可以让你使用缩进。(当然,你不能使用标签;这是一个网络表单。)如果我的编辑被接受的话,我已经为你准备好了。实际上我不需要为机器人分配内存。robota数组和robotb数组通过函数传递给我。我只需要使用它们。但是,doTask1将指针指向一个长度为2的数组,该数组包含线程使用的机器人。我不知道如何保留这个机器人,以及如何将它们传递给doTask,以便其他线程不会覆盖我传递给doTask的参数数组?是的,只要它们共享它,就会有问题,但如果我在锁中执行所有操作,那么它就不是并发的。我不熟悉线程编程,也不知道如何在这里提供并发性。有什么想法吗?