返回对象矢量变量

时间:2017-01-16 23:04:58

标签: c++ multithreading pthreads mutex

一些背景:我正在编写一个简单的出租车中心项目(c ++,在linux上),并且我被要求添加多线程以支持某些操作(我是多线程的新手)。

我需要实现的一个操作是计算其他线程中的驱动程序路径。 为了做到这一点,我希望我创建一个名为PathCalculation的类,保存路径向量和doneCalculation bool,因此计算路径的线程将接收指向PathCalculation对象的指针,将设置向量。

路径向量是一个局部变量,并且在getPath方法中应该线程安全地返回它,所以我锁定了向量的互斥锁,等待计算完成后使用基于条件变量的等待,但是我正要返回路径向量,我遇到了这个问题: 如果我在解锁互斥锁之前返回向量,则互斥锁将永远不会被解锁。 一个可能的解决方案是在返回向量之前解锁互斥锁,但我担心这会产生问题,并且线程:

以下是setPath和getPath的代码:

void PathCalculation::setPath(const std::vector<Point> &path) {
    //lock the path vector and the done variable
    pthread_mutex_lock(&pmtx);
    done = true;
    _path = path;
    // signal that the path was calculated.
    pthread_cond_signal(&dcond);
    // Unlock the mutex
    pthread_mutex_unlock(&pmtx);
}

const std::vector<Point> &PathCalculation::getPath() const {
    // Lock the path vector mutex
    pthread_mutex_lock(&pmtx);
    //wait until the path will be setted
    while (!done)
        pthread_cond_wait(&dcond, &pmtx);

    //unlock the mutex here?
    return _path;
    pthread_mutex_unlock(&pmtx); //will be never executed...
}

我的问题是:

在返回路径向量之前解锁互斥锁可能会导致线程问题吗? 如果确实如此,是否有任何线程安全的方法来解锁互斥锁并返回路径向量?

谢谢, 大卫

编辑: 由于@Andrew Henle评论说缺少一些细节,我将尝试解释更多有关该计划的内容:

Point类包含x,y。它不是线程安全的,不是设计为线程安全的。 我想做的就是以线程安全的方式返回路径。 使用路径向量的类是TaxiCenter: taxiCenter有一个名为addTrip(TripInfo * tripInfo)的函数,在多线程更新之前,要求该行程,计算路径,构造包含tripInfo *和向量的Trip对象,并将此行程添加到称为unassignedTrips的向量中。 有一个叫做Driver的类,它有setTrip(Trip * t)方法和drive()方法。在调用驱动方法时,驱动程序会“驱动”#34;它的行程,直到旅行结束。 为了分配行程,taxiCenter有一个名为assignTrip(int tripID)的函数,它在unassignedTrips向量上迭代,将它分配给驱动程序并从unassignedTrips向量中移除分配的行程。 现在,为了在其他线程上进行计算,我创建了上面显示的类,并在taxiCenter中有一个ThreadPool。当调用addTrip(TripInfo * tripInfo)方法时,我将创建新的PathCalculation对象,新的CalculatePathTask,将PathCalculation添加到taxiCenter中的向量,并将任务处理到threadPool。 然后,当我真的需要分配旅程时,我将迭代tripInfo&#39; s。当它找到分配行程的驱动程序时,它将从tripInfo构造Trip对象,并从PathCalculation构造路径向量。我想要做的就是将路径向量传递给Trip对象而不会复制太多,因为路径向量可能很大(2k点),并且复制此向量看起来对我来说太耗费资源,所以我想传递引用到那个向量。当然,如果我将复制矢量然后返回它,那么实现方式就没有问题,但它可能会消耗太多资源(重复复制2k点的矢量效率不高)。

您如何建议解决此问题? 我准备好了一切,改变了出租车中心的工作方式,重新设计了多线程计算,一切。我只想要一个精心设计的解决方案,在实践中被视为良好的代码。

再次感谢, 大卫

0 个答案:

没有答案