2017-11-22 4 views
0

元々は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); 

を私のプログラムが構築され、動作します...

私は何を得ていないのですか?何が起こっている

敬具、

+0

コードをコンパイルできないと難しくなりますが、「vis」はコピーできません。 – nwp

+0

あなたは '&vis'を意味しましたか? – doctorlove

+0

@doctorlove '&vis'を使うのはやや危険です。スレッドが完了して競合状態になるまで、「vis」が存続することを確認する必要があります。この問題を避けるため、 'std :: thread'は最初にコピーを作成します。 – nwp

答えて

0

ビジュアライザは移動コンストラクタを持っていないということです。

std::thread visualizer_thread(visualize, vis); 

visualize()はポインタを必要とします。

main()が終了したときにデータ(センサー、vis)が破壊され、割り当てられていないデータへのスレッドの読み書きを残すため、スレッドを正常に終了させるメカニズムが必要ですスタックに!

std :: unique_ptrまたはstd :: shared_ptr(これらは移動可能)を使用した動的割り当てを使用すると、問題を解決できます。

関連する問題