C++ 从相机中异步提取数据会产生随机崩溃
我有一个图形应用程序,可以从相机中提取数据。摄影机事件循环在对象中启动的线程中运行,我使用对象的setter/getter获取数据并使用它。但有时应用程序会崩溃。我没有使用任何同步机制 我有这个方法:C++ 从相机中异步提取数据会产生随机崩溃,c++,multithreading,asynchronous,C++,Multithreading,Asynchronous,我有一个图形应用程序,可以从相机中提取数据。摄影机事件循环在对象中启动的线程中运行,我使用对象的setter/getter获取数据并使用它。但有时应用程序会崩溃。我没有使用任何同步机制 我有这个方法: void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data) { colorData = data; } 我将其注册为外部库的回调: g_cnode.newSampleRecei
void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data)
{
colorData = data;
}
我将其注册为外部库的回调:
g_cnode.newSampleReceivedEvent().connect(&onNewColorSample);
每次从摄影机到达新帧时,都会调用该方法
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将下降,但我会尝试它。。。请给我一些想法 最后,我使用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;
};
然后我使用了这个类,向它传递一个指向mutex的指针mutex是我的类的一个成员:
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;
}
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;
}