2014-05-13 3 views
0

나는 부스트에서 동기화가 어떻게 작동하는지 연구 해왔다. 그러나 나는 아직도 내 문제를 해결하는 데 필요한 것이 무엇인지 혼란스러워한다. 필자는 응용 프로그램의 내 Augmented Reality 구성 요소에 대한 주요 스레드와 필요한 위치를 획득하는 작업 공간 교정을위한 두 번째 스레드를 가지고 있습니다. 위치 인수 때 HapticDevice 클래스 내부 초기화부스트 스레드 공유 벡터

#include <boost/thread.hpp> 

/* Holds data retrieved from HDAPI. */ 
struct DeviceData { 
    hduVector3Dd m_devicePosition; // Current device coordinates 
    hduMatrix m_transform; // Current device transform matrix 
}; 

class HapticDevice { 
public: 
    HapticDevice(); 

    std::vector<DeviceData> hdData; 

    HDSchedulerHandle hPositionCycle; 
    HHD hHD; 

    bool thread_running; 
    boost::thread haptic_thread; 

    void startThread(); 
    void threadPosAcquisition(); 

    void haptic_cleanup(HDSchedulerHandle hPositionCycle, HHD hHD); 
}; 

그리고 스레드 : 제 2 스레드가 교정이 필요한 경우에만 현재 시작되고있는 유일한 hdData 아래에 표시되는 벡터에 서면으로 하나가 될 것입니다

필수 :

HDCallbackCode HDCALLBACK positionAcquisitionCallback(void *pUserData); 

HapticDevice::HapticDevice() { 
thread_running = false; 
} 

void HapticDevice::startThread() { 
thread_running = true; 
haptic_thread = boost::thread(boost::bind(&HapticDevice::threadPosAcquisition, this)); 
} 

void HapticDevice::threadPosAcquisition() { 
    HapticDevice *hdev = (HapticDevice *) pUserData; 
    //acquires position per click made by user 
    //... 
} 

필기 도구 (위치를 클릭하면, 획득 및 벡터 내로 밀려 PER)는 사용자에 의해 제어되지만, 판독 메인 쓰레드에 의해 제어된다. 두 스레드간에 벡터를 공유 할 수 있기를 원하지만 어떻게 방법을 찾지 못했습니다. 뮤텍스는 어디에 두어야합니까?

비슷한 질문을 통해 boost :: ref를 통해 클래스를 전달했지만 클래스의 메서드를 사용하여 스레드를 시작 했으므로 변경해야 할 경우 더 혼란 스럽습니다. 나는 단순히 그렇게

HapticDevice haptic_device; 

처럼 내 MAIN.CPP에 햅틱 장치 개체를 정의하고 스레드를 시작하면 내 코드 여부를 ...

, 어떻게 2 스레드를 만드는 것을 변경에 액세스 할 ? 나는 현재 얼마나 많은 감각을 갖고 있는지 잘 모르겠다.

답변

0

음, 동기화 문제는 상당히 큰 주제입니다. Start with the boost documentation.

가장 단순한 경우, 리더와 라이터가 하나 인 경우 boost :: mutex 객체와 boost::unique_lock 가드 객체를 독자 내부 및 쓰기 함수에 사용할 수 있습니다. 독자 또는 작가 기능에서 어딘가에

class HapticDevice { 
... 
protected: 
    boost::muitex _mutex; 
.... 
} 

:

일반적으로 나쁜 코드 스타일에
boost::unique_lock<boost::mutex> _guard(hapticDeviceObject->_mutex); 

. 알고리즘에 따라 HapticDevice :: addDeviceData (const & DeviceData)와 같은 데이터를 추가하는 함수를 만들고 HapticDevice :: getDeviceData()와 같은 데이터를 검색하고 그 안에 필요한 모든 잠금을 수행합니다.

unique_lock 가드 객체는 실행이 리더 또는 라이터 기능에서 벗어날 때 (예 : 예외 또는 함수의 끝과 같은) 뮤텍스를 릴리스하는 데 필요합니다.

동시 독자가있는 경우 성능 향상을 위해 shared_lock을 사용하는 것이 좋습니다.

+0

고마워요! 나는 너의 제안을 따를 것이다. – Ada