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
原创粉丝点击