C++ GUI QT 第4版 之线程(二) 线程的同步(3)
来源:互联网 发布:mac界面 编辑:程序博客网 时间:2024/06/08 19:26
#include <QtCore>
#include <iostream>
const int DataSize = 100000;
const int BufferSize = 4096;
char buffer[BufferSize];
QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
freeSpace.acquire();
buffer[i % BufferSize] = "ACGT"[uint(std::rand()) % 4];
usedSpace.release();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = 0; i < DataSize; ++i) {
usedSpace.acquire();
std::cerr << buffer[i % BufferSize];
freeSpace.release();
}
std::cerr << std::endl;
}
int main()
{
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}
以下是转载
Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:
#include <QtCore/QCoreApplication>#include <QSemaphore>#include <QThread>#include <iostream>#include <QTime>const int DataSize = 100;const int BufferSize = 1;char buffer[BufferSize];QSemaphore freeSpace(BufferSize);QSemaphore usedSpace(0);class Producer : public QThread{protected: void run() { qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime())); qsrand(NULL); for (int i = 0; i < DataSize; ++i) { freeSpace.acquire(); std::cerr<<"P"; usedSpace.release(); } }};class Consumer : public QThread{protected: void run() { for (int i = 0; i < DataSize; ++i) { usedSpace.acquire(); std::cerr<<"C"; freeSpace.release(); } std::cerr<<std::endl; }};int main(int argc, char *argv[]){ Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait();return 0;}当DataSize = 100, BufferSize = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。
当DataSize = 100, BufferSize = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。
情况之一:
情况之二:
0 0
- C++ GUI QT 第4版 之线程(二) 线程的同步(3)
- C++ GUI QT 第4版 之线程(二) 线程的同步(4)
- C++ GUI QT 第4版 之线程(二) 线程的同步
- C++ GUI QT 第4版 之线程(二) 线程的同步(1)
- C++ GUI QT 第4版 之线程(二) 线程的同步(2)
- C++ GUI QT 第4版 之线程(一) 线程的初建
- C++ GUI QT 第4版 之线程(一) 线程的创建
- C++ GUI QT 第4版 之线程 -------总结
- C++ GUI QT 第4版 之线程(三) 与主线程通讯
- QT线程(二)---线程同步
- QT线程(二)---线程同步
- QT线程(二)---线程同步
- QT线程(二)---线程同步
- QT线程(二)---线程同步
- Qt多线程基础(二)线程同步之信号量
- Qt之线程同步
- Qt之线程同步
- Qt之线程同步
- 打洞技术说明-得出结论
- 通用存储过程
- Android button事件响应处理
- HDU 1054 A==B?
- R12.0 / R12.1 : Oracle EBS Context Variables (文档 ID 458282.1)
- C++ GUI QT 第4版 之线程(二) 线程的同步(3)
- uuid生成
- LAMP 部署
- initrd 解压
- 1017. A除以B (20)
- PAT A 1029. Median (25)
- ubuntu12.04下phpstorm安装
- HOJ 12808 杀死提莫(BFS)
- Kohana 数据库使用