簡體   English   中英

Boost線程共享向量

[英]Boost Thread Shared Vector

我一直在研究Boost中同步的工作原理,但是對於解決問題我仍然有些困惑。 我有兩個線程,其中一個主要用於應用程序的增強現實組件,另一個用於工作場所校准的線程可獲取所需的位置。

當前僅在需要校准時才啟動第二個線程,並且第二個線程將唯一寫入向量hdData,如下所示:

#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);
}; 

當需要位置獲取時,線程在HapticDevice類內部初始化:

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
    //...
}

寫入由用戶控制(單擊可獲取位置並將其推入向量),而讀取則由主線程控制。 我希望能夠在兩個線程之間共享向量,但是我還沒有弄清楚該如何做。 我將在哪里放置互斥鎖?

我在這里發現了一些類似的問題,並通過boost :: ref將類傳遞給了我,但是由於我使用的是類的方法來啟動線程,因此如果我需要更改代碼,只會使我更加困惑...

如果我像這樣在main.cpp中簡單地定義觸覺設備對象

HapticDevice haptic_device;

並啟動線程,我如何訪問第二線程所做的更改? 我不太確定自己目前在道歉的程度。

好吧,同步本身就是一個很大的話題。 從boost文檔開始

在最簡單的情況下,當您有一個讀取器和一個寫入器時,可以在讀取器和寫入函數內部使用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來提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM