【发布时间】:2017-11-22 10:35:32
【问题描述】:
最初来自 Java,我在 C++11 中的 2 个线程之间共享数据时遇到问题。我在没有帮助的情况下彻底阅读了这里的多线程帖子,我只是想知道为什么我的方法不适用于多线程的 C++ 语法。
简而言之我的申请:
我有一个线程读取硬件传感器并将该数据转储到某个共享数据监视器
我想要另一个线程监听那个监视器的数据变化,并根据新数据绘制一些图形内容(是的,我在我的监视器中使用条件变量)
下面是我的 Main 类和 main 方法:
#include <cstdlib>
#include <iostream>
#include <thread>
#include <sweep/sweep.hpp>
#include <pcl/ModelCoefficients.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/features/normal_3d.h>
#include "include/LiDAR.h"
#include "include/Visualizer.h"
void run_LiDAR(LiDAR* lidar){
lidar->run();
}
void visualize(Visualizer* visualizer){
visualizer->run();
}
int main(int argc, char* argv[]) try {
Monitor mon; //The monitor holding shared data
LiDAR sensor(&mon); //Sensor object dumping data to the monitor
Visualizer vis(&mon); //Visualizer listening to data changes and updates the visuals accordingly
std::thread sweep_thread(run_LiDAR, &sensor); //Starting the LiDAR thread
std::cout << "Started Sweep thread" << std::endl;
std::thread visualizer_thread(visualize, vis);
std::cout << "Started Visualizer thread" << std::endl;
while(1){
//Do some calculations on the data in Monitor mon
mon.cluster();
}
}
转储数据的传感器线程运行良好,运行聚类算法的主线程也运行良好。但是我收到以下错误消息:
In file included from MY_DIRECTORY/Main.cpp:3: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:336:5: error: attempt to use a deleted function
__invoke(_VSTD::move(_VSTD::get<1>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
如果我评论该行:
std::thread visualizer_thread(visualize, vis);
我的程序构建并运行...
我没有得到什么?
亲切的问候,
【问题讨论】:
-
无法编译代码很难说,但看起来
vis无法复制。 -
你的意思是
&vis? -
@doctorlove 使用
&vis有点危险。您需要确保vis一直存在到线程完成后,并注意竞争条件。为了避免这个问题,std::thread首先制作了一个副本。 -
确实....只是显示了这将在哪里结束-代码使用
&sensor(使用&mon)并且没有线程连接...
标签: multithreading c++11 point-cloud-library