如何在给定的openmp线程完成时退出程序

时间:2013-06-04 21:10:46

标签: c++ multithreading openmp

我有一些记录软件,我用它来捕捉来自多个Point Grey相机,GPS和Phidg​​et传感器的图像。

我使用OpenMP将不同的任务卸载到不同的线程。他们是以下......

  • 主题3 - 更新GPS值(存储在结构中)
  • 线程2 - 更新Phidg​​et值(存储在结构中)
  • 线程1 - 从GPS和Phidg​​et结构中获取图像和最新值

当程序运行时,它会显示图像,gps和加速计数据。我点击“L”键,数据记录正常。

问题

我按'x'键将 grabimgs 设置为 false 以退出线程1中的while循环。这会停止正在更新的图像。我希望这也会更新其他线程中的变量,它们也会停止......但它们不会。

这是我不明白的一点,我可以用线程1共享在其他线程(Phidg​​et和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;

}

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

1 个答案:

答案 0 :(得分:0)

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

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