提升线程共享矢量

时间:2014-05-13 11:55:33

标签: c++ boost

我一直在研究同步在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;

启动该主题,如何访问第二个主题所做的更改?我不太确定我目前有多大意义,道歉。

1 个答案:

答案 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 来提高性能。