元々はJavaから来ていましたが、C++ 11では2つのスレッド間でデータ共有に問題があります。私は援助なしでここでマルチスレッドの記事を徹底的に読んだので、私のアプローチがマルチスレッドのためのOK C++の構文ではないことを知りたいだけです。スレッド間のC++データの共有C++
要するに私のアプリケーション:
私は1つのスレッドがハードウェアセンサーを読み取り、いくつかの共有データモニタへのデータ
は、私は別のスレッドがその非常にモニターのデータの変化を聴きたいことを投棄してい以下
が私のメインクラスウィットである(はい、私は私のモニターの条件varibleを使用しています)、新しいデータに基づいて、いくつかのグラフィカルなものを描きますh主な方法:
#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」はコピーできません。 – nwp
あなたは '&vis'を意味しましたか? – doctorlove
@doctorlove '&vis'を使うのはやや危険です。スレッドが完了して競合状態になるまで、「vis」が存続することを確認する必要があります。この問題を避けるため、 'std :: thread'は最初にコピーを作成します。 – nwp