您的位置:首页 > 编程语言 > Qt开发

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两个类完成生产者和消费者实例,对

我们实际工作很有益处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: