如何在给定的openmp线程结束时退出程序
how to exit a program when a given openmp thread finishes
我有一些日志软件,我已经写了从多个点灰相机,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
相关文章:
- 结束另一个线程中使用的对象的生存期
- 使用 shared_ptr 在中断时结束多线程循环
- C++:我可以在线程仍在运行时为线程提供新值,还是必须先结束它?
- 线程池如何结束程序
- 为什么我的线程永远不会结束
- 当进程结束时,处于Sleep()中间的线程会发生什么
- Linux C++程序以一个仍在运行的线程结束后该怎么办
- 线程未正确结束:它忽略失败的循环条件
- 哪个线程以多线程结束
- C++结束从主线程分离的线程
- 函数执行结束时,向量中的线程会发生什么情况
- 如何在给定的openmp线程结束时退出程序
- 等待线程结束(c++)
- 等待线程/s直到另一个线程/s结束
- QThread::quit()是立即结束线程还是等到返回事件循环
- 线程意外结束.c++
- c++在另一个线程中观察main()的结束
- 分离线程执行结束
- 如果由于接收对象的线程已结束而未处理Qt信号,参数会被删除吗?
- 使用async结束线程并超出其未来的范围是否安全?