Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从相机中异步提取数据会产生随机崩溃_C++_Multithreading_Asynchronous - Fatal编程技术网

C++ 从相机中异步提取数据会产生随机崩溃

C++ 从相机中异步提取数据会产生随机崩溃,c++,multithreading,asynchronous,C++,Multithreading,Asynchronous,我有一个图形应用程序,可以从相机中提取数据。摄影机事件循环在对象中启动的线程中运行,我使用对象的setter/getter获取数据并使用它。但有时应用程序会崩溃。我没有使用任何同步机制 我有这个方法: void MyClass::onNewColorSample(ColorNode node, ColorNode::NewSampleReceivedData data) { colorData = data; } 我将其注册为外部库的回调: g_cnode.newSampleRecei

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

我有这个方法:

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;
}