Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在给定openmp线程完成时退出程序_C++_Multithreading_Openmp - Fatal编程技术网

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

C++ 如何在给定openmp线程完成时退出程序,c++,multithreading,openmp,C++,Multithreading,Openmp,我有一些记录软件,我已经写了从多点灰色相机,GPS和Phidget传感器捕捉图像 我使用OpenMP将不同的任务卸载到不同的线程。它们如下所示 线程3-更新GPS值(存储在结构中) 线程2-更新Phidget值(存储在结构中) 线程1-从GPS和Phidget结构获取图像和最新值 当程序运行时,它会显示图像、gps和加速计数据。我按了“L”键,数据记录工作正常 问题 我按下“x”键将grabimgs设置为false以退出线程1中的while循环。这将停止更新图像。我希望这也会更新其他线程中的

我有一些记录软件,我已经写了从多点灰色相机,GPS和Phidget传感器捕捉图像

我使用OpenMP将不同的任务卸载到不同的线程。它们如下所示

  • 线程3-更新GPS值(存储在结构中)
  • 线程2-更新Phidget值(存储在结构中)
  • 线程1-从GPS和Phidget结构获取图像和最新值
当程序运行时,它会显示图像、gps和加速计数据。我按了“L”键,数据记录工作正常

问题 我按下“x”键将grabimgs设置为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;
intmain(){
//连接标志
bool摄像头连接=错误;
bool-phidget_-connected=false;
bool GPS_connected=错误;
如果(第1章连接摄像头()){

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


另请参见

可能的副本“是”,同意。很抱歉,我以前没有找到!