在我接触多线程编程以来,都是把“多线程”等同于“异步”,使用多线程基本上也都是为了不阻塞主线程(如界面),才单独开一个线程“后台”运行。最近遇到的情况是数据分析程序的处理速度跟不上数据采集程序,因此考虑使用多个worker线程并行的处理采集到的数据。尝试使用OpenMP
,在程序中使用类似于这种代码
#pragma omp parallel for
for (int i=0;i<6;++i){run();}
但是性能还是达不到期望,电脑有10多核,开6个线程,却只能把运行速度提高2~3倍,并且再增加线程也没有提高速度。
You’re doing it wrong…
决定好好琢磨一下多线程。我这里主程序是用Qt做的,希望尽量使用Qt自带的库,所以多线程也是使用QThread
,仔细考虑过之后得到的思路是维护一个线程安全的队列,然后数据采集线程和多个数据处理线程分别向这个队列传入和取出数据,实现并发,也就是所谓的“单生产者、多消费者模式”。
线程安全的队列是这样的
//dataqueue.h
#include <QQueue>
#include <QMutexLocker>
//thread-safe queue
class DataQueue
{
QMutex m_mutex;QQueue<void*> m_datas;
public:
DataQueue();
void enqueue(void*);void* dequeue();
};
//dataqueue.cpp
#include