QT(13)-多线程-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 
#include 
#include 
#include 
//
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();
}

 

你可能感兴趣的:(QT(13)-多线程-QSemaphore)