【问题标题】:C++ data sharing between threads c++线程之间的 C++ 数据共享 c++
【发布时间】: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无法复制。
  • 你的意思是&amp;vis
  • @doctorlove 使用&amp;vis 有点危险。您需要确保 vis 一直存在到线程完成后,并注意竞争条件。为了避免这个问题,std::thread 首先制作了一个副本。
  • 确实....只是显示了这将在哪里结束-代码使用&amp;sensor(使用&amp;mon)并且没有线程连接...

标签: multithreading c++11 point-cloud-library


【解决方案1】:

发生的事情是 Visualizer 没有移动构造函数。

  std::thread visualizer_thread(visualize, vis);

visualize() 需要一个指针。

顺便说一句,你应该让你有一个机制来有序地结束你的线程,因为当 main() 退出时数据(传感器,vis)会自行销毁,让线程读取/写入未分配的数据堆栈!

使用 std::unique_ptr 或 std::shared_ptr(可移动)进行动态分配可以消除此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多