我一直在研究同步在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;
启动该主题,如何访问第二个主题所做的更改?我不太确定我目前有多大意义,道歉。
答案 0 :(得分: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&amp; DeviceData),以及检索数据,如HapticDevice :: getDeviceData(),并在其中执行所有必需的锁定。
当执行超出读取器或编写器功能时(例如异常或函数结束),需要使用unique_lock保护对象来释放互斥锁。
如果您有优秀的读者,可以考虑使用shared_lock 来提高性能。