QT(16)-多线程-QSemaphore-示例源码
QThread
1. 创建线程子类 MyThread 启动、停止。
thread.start(); thread.stop();
2.基本操作
2.1得到线程ID Int m_currentThreadID=CurrentThreadID();
2.2得到线程指针 QThread *pCurThread=currentThread();
2.3同步线程
|
|
|
|
|
| QMutex | 互斥锁 | 共享数据 |
|
| QReadWriteLock | 读写锁 | 针对操作 |
|
| QSemaphore | 多个资源 | 同类型 |
|
| QWaitCondition | 条件变量 | 唤醒其他线程 |
|
功能:我有一个公共区域,多个线程都会操作这里面的数据,且这里面的数据是一种数据类型。
如何处理呢?对公共区域的每个元素添加信号量,告诉大家是否这个元素被操作。
QSemaphore 使用的是生产者消费者模型。
生产者就是写数据的,把自由空间->用过的空间
消费者是读数据的,把用过的->自由空间
转换成代码就是:
unsigned int buffer[4096];//公共区域
QSemaphore usedSem(0);// 对应的信号量已用量
QSemaphore unusedSem(4096);//对应的信号量 未使用变量
操作:acquire() 授权 release()释放
代码,网上搜的。
/**************************************
*说明:生产者——消费者线程模型
***************************************/
#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <stdio.h>
//
QSemaphore usedSem(0);//已用量
QSemaphore unusedSem(4096);//未使用变量
unsigned int buffer[4096];//缓冲区
//生产者线程
class producer:public QThread
{
public:
producer();
private:
void run();
};
producer::producer()
{
;
}
//
void producer::run()
{
int i=0;
for(i=0;i<10000;i++)
{
unusedSem.acquire();//空闲信号量减1
buffer[i%4096]=i;
usedSem.release();//已用信号量加1
}
}
//消费者线程
class customer:public QThread
{
public:
customer();
private:
void run();
};
customer::customer()
{
;
}
void customer::run()
{
int i=0;
for(i=0;i<10000;i++)
{
usedSem.acquire();//已用信号量减1
printf("%d\n",buffer[i%4096]);
unusedSem.release();//空闲信号量加1
}
}
//
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//
producer producerThread;
customer customerThread;
//
producerThread.start();
customerThread.start();
//
producerThread.wait();
customerThread.wait();
//
return a.exec();
}

浙公网安备 33010602011771号