QT多线程中的互斥与同步
2015-10-09 19:01
525 查看
qt为实现线程的同步与互斥,提供了几个类。
下面主要介绍三个类:
一、QMutex和QMutexLocker
[cpp] view
plaincopy
class key
{
public:
key(){key = 0;}
int createKey(){QMutexLocker locker(&mutex);++key;return key;}
int value() const {QMutexLocker locker(&mutex);return key;}
private:
int key;
Qmutex mutex;
};
二、QSemaphore
[cpp] view
plaincopy
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
const int DataSize = 100000;
const int BufferSize = 8192;
int buffer[BufferSize];
QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes(0);
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
freeBytes.acquire();
buffer[i % BufferSize] = (i % BufferSize);
usedBytes.release();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = 0; i < DataSize; ++i) {
usedBytes.acquire();
fprintf(stderr, "%d ", buffer[i % BufferSize]);
if(i % 16 ==0 && i!=0)
fprintf(stderr, "/n");
freeBytes.release();
}
fprintf(stderr, "/n");
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
// return 0;
return app.exec();
}
三、QWaitCondition
[cpp] view
plaincopy
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
const int DataSize = 10000;
const int BufferSize = 8192;
int buffer[BufferSize];
QWaitCondition bufferEmpty;
QWaitCondition bufferFull;
QMutex mutex;
int numUsedBytes = 0;
int rIndex=0;
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
mutex.lock();
if (numUsedBytes == BufferSize)
bufferEmpty.wait(&mutex);
// mutex.unlock();
buffer[i % BufferSize] = numUsedBytes;
// mutex.lock();
++numUsedBytes;
bufferFull.wakeAll();
mutex.unlock();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
forever {
mutex.lock();
if (numUsedBytes == 0)
bufferFull.wait(&mutex);
// mutex.unlock();
printf("%ul::[%d]=%d->%d /n", currentThreadId (),rIndex,buffer[rIndex],numUsedBytes);
// mutex.lock();
rIndex = (++rIndex)%BufferSize;
--numUsedBytes;
bufferEmpty.wakeAll();
mutex.unlock();
}
printf("/n");
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
for (int i = 0; i < BufferSize; ++i) {
buffer[i ] = -1;
}
Producer producer;
Consumer consumerA;
Consumer consumerB;
producer.start();
consumerA.start();
consumerB.start();
producer.wait();
consumerA.wait();
consumerB.wait();
return 0;
}
上面用QSemaphore和QWaitCondition两个类完成生产者和消费者实例,对
我们实际工作很有益处。
下面主要介绍三个类:
一、QMutex和QMutexLocker
[cpp] view
plaincopy
class key
{
public:
key(){key = 0;}
int createKey(){QMutexLocker locker(&mutex);++key;return key;}
int value() const {QMutexLocker locker(&mutex);return key;}
private:
int key;
Qmutex mutex;
};
二、QSemaphore
[cpp] view
plaincopy
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
const int DataSize = 100000;
const int BufferSize = 8192;
int buffer[BufferSize];
QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes(0);
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
freeBytes.acquire();
buffer[i % BufferSize] = (i % BufferSize);
usedBytes.release();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = 0; i < DataSize; ++i) {
usedBytes.acquire();
fprintf(stderr, "%d ", buffer[i % BufferSize]);
if(i % 16 ==0 && i!=0)
fprintf(stderr, "/n");
freeBytes.release();
}
fprintf(stderr, "/n");
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
// return 0;
return app.exec();
}
三、QWaitCondition
[cpp] view
plaincopy
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
const int DataSize = 10000;
const int BufferSize = 8192;
int buffer[BufferSize];
QWaitCondition bufferEmpty;
QWaitCondition bufferFull;
QMutex mutex;
int numUsedBytes = 0;
int rIndex=0;
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
mutex.lock();
if (numUsedBytes == BufferSize)
bufferEmpty.wait(&mutex);
// mutex.unlock();
buffer[i % BufferSize] = numUsedBytes;
// mutex.lock();
++numUsedBytes;
bufferFull.wakeAll();
mutex.unlock();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
forever {
mutex.lock();
if (numUsedBytes == 0)
bufferFull.wait(&mutex);
// mutex.unlock();
printf("%ul::[%d]=%d->%d /n", currentThreadId (),rIndex,buffer[rIndex],numUsedBytes);
// mutex.lock();
rIndex = (++rIndex)%BufferSize;
--numUsedBytes;
bufferEmpty.wakeAll();
mutex.unlock();
}
printf("/n");
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
for (int i = 0; i < BufferSize; ++i) {
buffer[i ] = -1;
}
Producer producer;
Consumer consumerA;
Consumer consumerB;
producer.start();
consumerA.start();
consumerB.start();
producer.wait();
consumerA.wait();
consumerB.wait();
return 0;
}
上面用QSemaphore和QWaitCondition两个类完成生产者和消费者实例,对
我们实际工作很有益处。
相关文章推荐
- Qt Creator 3.2.1(基于QT5)解决无法输入中文
- qt 打印 QPrinter类
- QT 布局
- QT弹出消息框
- Qt多线程编程
- windows下完美的"免费"QT开发环境: QtCreator + VC2008Express
- QT工程文件的条件编译选择与额外的编译参数配置
- [置顶] Qt放大镜代码设计
- qt 中文显示问题.(用printf 输出QString 内容)
- Qt学习
- Qt5版本的例子去哪儿了?
- Qt之中文显示(QMessageBox、QLineEdit右键菜单等)
- qt+zint实现打印一维条形码
- qt+vs 系统找不到指定的路径
- 【QT】QT4.8.6静态编译
- PyQt5程序
- Qt 改变图片亮度算法
- qt 事件机制
- 自学QT之任务栏预览视图按钮
- qt5不能输入中文问题