从相机拉出的异步数据会产生随机崩溃

时间:2014-02-19 20:44:47

标签: c++ multithreading asynchronous

我有一个从相机中提取数据的图形应用程序。相机事件循环在一个在对象中启动的线程中运行,我使用该对象的setter / getter来获取数据并使用它。但有时应用程序崩溃。我没有使用任何同步机制。

我有这个方法:

void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data)
{
    colorData = data;
}

我将其注册为外部库的回调:

g_cnode.newSampleReceivedEvent().connect(&onNewColorSample);

每次从相机到达新帧时都会调用该方法。

colorData的吸气者是:

ColorNode::NewSampleReceivedData MyClass::getColorData()
{
    return colorData;
}

然后我使用pthread运行以下内容:

void* MyClass::runThread(void* na)
{
    g_context.run();
}

在某些时候我开始了这个帖子:

pthread_create(&pthread, NULL, runThread, NULL);

然后类MyClass从线程中的摄像机获取数据。

库的run方法文档说:

运行DepthSense事件循环。连接的事件处理程序在名为run()的线程中运行。

现在我使用myClass从相机中获取数据,在我每隔1/60秒调用一个方法的另一个类中:

static ColorNode::NewSampleReceivedData  colorFrame;
depthFrame = dsCam.getDetphData();
... 

有时应用程序在dsCam.getDepthData()中崩溃。

我认为发生问题的原因是当此方法返回时正在复制数据,并且在复制操作过程中我获得了新数据。

我使用一个线程,因为外部库没有提供非阻塞机制来获取数据。它只是提供了一个基于事件的机制。

我担心如果我使用互斥锁定/解锁机制我的FPS会下降,但我会尝试...请给我一些想法。

1 个答案:

答案 0 :(得分:0)

最后我用QMutex解决了这个问题:

//RAII class to unlock after method return (when local var out of scope)

class AutoMutex {
public:
    AutoMutex(QMutex* _mutex) {
        _mutex->lock();
        myMutex = _mutex;
    }
    ~AutoMutex() {
        myMutex->unlock();
    }
private:
    QMutex* myMutex;

};

然后我只使用了这个类,向它传递一个指向互斥锁的指针(互斥体是我班级的成员):

ColorNode::NewSampleReceivedData MyClass::getColorData()
{
    AutoMutex autoMut(&mutex); //mutex get locked
    return colorData;
} //when method ends, autoMut is destroyed and mutex get unlocked

DepthNode::NewSampleReceivedData MyClass::getDetphData()
{
    AutoMutex autoMut(&mutex);
    return depthData;
}