如何在给定的openmp线程结束时退出程序

how to exit a program when a given openmp thread finishes

本文关键字:线程 结束 退出程序 openmp      更新时间:2023-10-16

我有一些日志软件,我已经写了从多个点灰相机,GPS和Phidget传感器捕获图像。

我使用OpenMP将不同的任务卸载到不同的线程。它们是……

  • 线程3 -更新GPS值(存储在struct中)
  • 线程2 -更新Phidget值(存储在struct中)
  • 线程1 -从GPS和Phidget结构中获取图像和最新值

当程序运行时,它显示图像,gps和加速度计数据很好。我按了'L'键,数据的记录工作正常。

我按'x'键将抓取设置为false以退出线程1中的while循环。这将停止更新图像。我希望这也会更新其他线程中的变量,他们也会停止…但他们没有。

这是我不明白的位,我可以与线程1共享在其他线程(Phidget和GPS数据)中获得的数据。一旦从相机获得新的图像,加速度计和GPS的最新值就被转储到文件中。

int main() {
    //connection flags
    bool cameras_connected  = false;
    bool phidget_connected  = false;
    bool GPS_connected      = false;
    if (cap.ConnectCameras()) {
        cout << "Connected to FireFly cameras" << endl;
        cameras_connected = true;
    } 
    if (GPS.isReady()) { 
        cout << "Connected to GPS" << endl;
        GPS_connected = true;
    }
    if (Phid.connectPhidget()) { 
        cout << "Connected to Phidget" << endl;
        phidget_connected = true;
    }

bool grabimgs = true;
#pragma omp parallel sections shared(GPSData,PhidgetData,grabimgs,cameras_connected,phidget_connected,GPS_connected)
{
    //---- THREAD 1 ----
    // Camera Capture Thread
    #pragma omp section
    {
        while(grabimgs) {
            vector<cv::Mat> Images;
            if(cap.GrabMats(Images)) {
                //do imshow and logging bits
                //GPS and Phidget data is written and displayed from here
                char key = cv::waitKey(1000/30);
                if (key=='x'){
                    grabimgs = false;
                    doLogging = false;
                } 
            }
        }
    }   //END OF THREAD 1
    //---- THREAD 2 ----
    //Phidget Capture Thread
    #pragma omp section
    {
        if (phidget_connected) {
            while(grabimgs) {
                cout << "grabimgs in thread 2 = " << grabimgs << endl;
                //get Phidget data
                Phid.updateReadings(PhidgetData);
            }
        }
    }   //END OF THREAD 2

    //---- THREAD 3 ----
    //GPS Capture Thread
    #pragma omp section
    {
        if(GPS_connected) {
            while(grabimgs) {
                cout << "grabimgs in thread 3 = " << grabimgs << endl;
                //get GPS Data
                GPS.update(GPSData,FORCE_UPDATE);
            }
        }
    }   //END OF THREAD 3
}// end of OMP
return 1;

}

那么为什么我不能使用抓取来指示其他线程停止呢?我在Win7 x64, Visual Studio 2010上使用c++。

您应该将变量flush与其他线程同步:flush(grabimgs)

参见https://computing.llnl.gov/tutorials/openMP/#FLUSH