提供了并发的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);
}
如果机器人是全局资源,线程不应该处理它们。它应该是主线程退出(或清理)功能的职责。 另外,应该有一种方法让线程明确地定位机器人,并锁定它们的使用。
的robot1
阵列似乎存储机器人,这似乎是一个全球性的阵列。但是:
它的访问不是由一个互斥(
pthread_mutex_t
)保护,现在你已经采取了处理这件事似乎。此外,
task1
中的代码始终修改此阵列的条目0
和1
。如果两个或更多线程执行该代码,则条目将被覆盖。我不认为这是你想要的。之后如何使用该阵列?
事实上,为什么这个数组需要是全局的?
底线是这样的:只要这个数组由线程共享,他们将有问题并发。想想这样:
你有两家公司使用机器人工作,但他们使用相同的卡车(robot1
)来移动机器人。这两家公司应该如何运作正确和有效只有一个卡车?
其实我不需要为机器人分配内存。一系列robota和一系列robotb通过函数传递给我。我只需要使用它们。但是,doTask1将指针指向长度为2的数组,该数组包含要由线程使用的机器人。我不知道如何保留这些机器人,我如何将这些传递给doTask,以便其他线程不会覆盖我传递给doTask的参数数组? – user2162317 2013-03-13 03:57:29
我想要并发。 – user2162317 2013-03-13 04:17:47
是的,只要他们分享,就会有问题,但如果我把所有事情都锁定在一起,那么它就不是并发的。我不熟悉线程编程,我不知道如何在这里提供并发。任何想法? – user2162317 2013-03-13 13:51:19
你能FORMATT你的代码更好?很难读出它显示的方式。 – 2013-03-12 18:54:04
它不让我使用缩进,这就是为什么它是这样的 – user2162317 2013-03-12 20:07:02
什么不喜欢你使用缩进?所以确实让你使用缩进。 (当然,你不能使用标签;它是一个网络表单。)如果我的编辑被接受,我已经为你准备好了。 – 2013-03-12 20:23:55