[英]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.