#include <QApplication>
#include <QMutex>
#include <QThread>
#include <QSemaphore>
#include <QMutexLocker>
#include <QReadWriteLock>
#include <iostream>
using namespace std;
const int DATA_SIZE = 100;
const int BUF_SIZE = 10;
int buf[BUF_SIZE] = {0};
QMutex mutex;// 控制线程间的互斥
/********freeSpace和useSpace控制线程间的同步********/
// 控制可被生产者填充数据的那部分缓冲区
QSemaphore freeSpace(BUF_SIZE);// 程序开始启动时,生产者会有BUF_SIZE个空间生产数据
// 控制可被消费者读取数据的那部分缓冲区
QSemaphore useSpace(0);// 程序开始启动时,消费者会有0个空间取数据
class CProducer : public QThread
{
protected:
virtual void run()
{
for (int i = 0 ; i < DATA_SIZE ; ++i)
{
freeSpace.acquire();// 当前信号量是否有可以填充数据的缓冲区,如果资源计数为0,则没有可以填充的缓冲区,那么该函数会阻塞当前线程
{
QMutexLocker locker(&mutex);
buf[i%BUF_SIZE] = qrand() % 50 + 1;
cout << "produce data is :" << buf[i%BUF_SIZE] << endl;
}
useSpace.release();// 使useSpace对象的资源计数加1,此时消费者线程就有机会取数据了
}
}
};
class CConsumer : public QThread
{
protected:
virtual void run()
{
for (int i = 0 ; i < DATA_SIZE ; ++i)
{
useSpace.acquire();// 当前信号量是否有可以取数据的缓冲区,如果资源计数为0,则没有可取的缓冲区,那么该函数会阻塞当前线程
{
QMutexLocker locker(&mutex);
int nData = buf[i%BUF_SIZE];
cout << "consume data is: " << nData << endl;
}
freeSpace.release();// 使freeSpace对象的资源计数加1,此时生产者线程就有机会生产数据了
}
}
};
int main(int argc, char *argv[])
{
CProducer producer;
CConsumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}
qt线程同步之信号量
最新推荐文章于 2024-07-21 11:53:54 发布