最初来自Java,我遇到了C ++ 11中2个线程之间数据共享的问题。我已经在没有帮助的情况下彻底阅读了多线程帖子,我只想知道为什么我的方法不适合多线程的C ++语法。
简短的申请:
我有一个线程正在读取硬件传感器并将该数据转储到某个共享数据监视器
我希望另一个线程监听该监视器的数据更改,并根据新数据绘制一些图形内容(是的,我在监视器中使用条件变量)
下面是我的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);
我的程序构建并运行...
我没有得到什么?
亲切的问候,
答案 0 :(得分:0)
发生的事情是Visualizer没有移动构造函数。
std::thread visualizer_thread(visualize, vis);
visualize()需要一个指针。
顺便说一下,你应该让你有一种机制以有序的方式结束你的线程,因为当main()退出时数据(传感器,vis)会自行销毁,让线程读/写未分配的数据堆栈!
使用std :: unique_ptr或std :: shared_ptr(可移动)进行动态分配可以解决问题。