提供了并发的Pthreads

问题描述:

之间

我工作的多线程编程和我坚持的东西。提供了并发的Pthreads

在我的计划有两个任务和两个类型的机器人用于执行任务:

  • 任务1需要某两种机器人和

  • 任务2需要2 robot1类型和2机器人2型。

机器人1和机器人2的总数以及指向这两种类型的指针用于初始化。线程共享这些机器人并保留机器人,直到线程完成。

实际任务是在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); 
} 
+0

你能FORMATT你的代码更好?很难读出它显示的方式。 – 2013-03-12 18:54:04

+0

它不让我使用缩进,这就是为什么它是这样的 – user2162317 2013-03-12 20:07:02

+0

什么不喜欢你使用缩进?所以确实让你使用缩进。 (当然,你不能使用标签;它是一个网络表单。)如果我的编辑被接受,我已经为你准备好了。 – 2013-03-12 20:23:55

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

robot1阵列似乎存储机器人,这似乎是一个全球性的阵列。但是:

  • 它的访问不是由一个互斥(pthread_mutex_t)保护,现在你已经采取了处理这件事似乎。

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

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

底线是这样的:只要这个数组由线程共享,他们有问题并发。想想这样:

你有两家公司使用机器人工作,但他们使用相同的卡车(robot1)来移动机器人。这两家公司应该如何运作正确有效只有一个卡车?

+0

其实我不需要为机器人分配内存。一系列robota和一系列robotb通过函数传递给我。我只需要使用它们。但是,doTask1将指针指向长度为2的数组,该数组包含要由线程使用的机器人。我不知道如何保留这些机器人,我如何将这些传递给doTask,以便其他线程不会覆盖我传递给doTask的参数数组? – user2162317 2013-03-13 03:57:29

+0

我想要并发。 – user2162317 2013-03-13 04:17:47

+0

是的,只要他们分享,就会有问题,但如果我把所有事情都锁定在一起,那么它就不是并发的。我不熟悉线程编程,我不知道如何在这里提供并发。任何想法? – user2162317 2013-03-13 13:51:19