2017-11-22 78 views
0

원래 Java에서 왔기 때문에 C++ 11에서 두 스레드 간의 데이터 공유에 문제가 있습니다. 나는 철저히 여기에 도움없이 멀티 쓰레드 게시물을 읽었고, 나는 왜 내 접근 방식이 멀티 스레딩을위한 OK C++ 구문이 아닌지 알고 싶습니다. 짧은스레드 간 C++ 데이터 공유 C++

내 응용 프로그램 :

  • 내가 하나 개의 스레드 하드웨어 센서를 읽고 일부 공유 데이터에 대한 데이터를 모니터링하는 것이 투기가

  • 내가 바로 그 모니터의 데이터 변경 사항을 듣고 다른 스레드를 원하는 및

    다음

내 Main 클래스의 지혜입니다 (예, 나는 내 모니터의 조건 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(); 
    } 
} 

데이터 덤프 센서 스레드 선행 등 클러스터링 알고리즘을 실행하는 메인 쓰레드을한다.

내 프로그램 빌드 및 작동
std::thread visualizer_thread(visualize, vis); 

...

나는 무엇을 얻고 있지 않다 : 나는 라인을 코멘트 경우

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))...); 

: 나는 다음과 같은 오류 메시지가 그러나? 무슨 일이 일어나고 무엇

종류와 관련,

+0

코드를 컴파일 할 수 없으면 말할 수 없지만 'vis'는 복사 할 수 없습니다. – nwp

+0

'& vis'을 (를) 사용하셨습니까? – doctorlove

+0

@doctorlove'& vis'를 사용하는 것은 다소 위험합니다. 쓰레드가 완료되고 경주 조건에주의 할 때까지'vis'가 살아 있는지 확인해야합니다. 이 문제를 피하기 위해서'std :: thread'는 처음부터 복사를합니다. – nwp

답변

0

은 비주얼이 이동 생성자가 없다는 것입니다.

std::thread visualizer_thread(visualize, vis); 

visualize()는 포인터를 필요로합니다.

메인()이 종료 될 때 데이터 (센서, vis)가 파괴되어 할당되지 않은 데이터에 대한 읽기/쓰기 작업이 남기 때문에 순서대로 스레드를 종료 할 수있는 메커니즘을 만들어야합니다 스택에!

동적 할당을 사용하여 std :: unique_ptr 또는 std :: shared_ptr (이동 가능)을 사용하면 문제를 해결할 수 있습니다.