相当于建立了一些等待队列;
#include <QtCore>
#include <iostream>
const int DataSize = 100000;
const int BufferSize = 4096;
char buffer[BufferSize];
QWaitCondition bufferIsNotFull;
QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace = 0;
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
mutex.lock();
while (usedSpace == BufferSize)
bufferIsNotFull.wait(&mutex);
buffer[i % BufferSize] = "ACGT"[uint(std::rand()) % 4];
++usedSpace;
bufferIsNotEmpty.wakeAll();
mutex.unlock();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = 0; i < DataSize; ++i) {
mutex.lock();
while (usedSpace == 0)
bufferIsNotEmpty.wait(&mutex);
std::cerr << buffer[i % BufferSize];
--usedSpace;
bufferIsNotFull.wakeAll();
mutex.unlock();
}
std::cerr << std::endl;
}
int main()
{
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}
#include <QApplication>
#include <QtGui>
#include <QtCore>
QWaitCondition ieq10;
QMutex mutex;
int
i = 0;
class
Thread1:
public
QThread
{
public
:
Thread1(){}
private
:
protected
:
void
run()
{
qDebug() <<
"thread1 start...\n"
;
for
(;;)
{
mutex.lock();
if
(i == 10)
{
ieq10.wakeAll();
mutex.unlock();
qDebug() <<
"thread1 exit...\n"
;
break
;
}
qDebug() <<
"i == "
<<i<<endl;
++ i;
sleep(1);
mutex.unlock();
}
}
};
class
Thread2:
public
QThread
{
public
:
Thread2(){}
protected
:
void
run()
{
qDebug() <<
"thread2 start...\n"
;
for
(;;)
{
mutex.lock();
if
(i < 10)
{
qDebug() <<
"thread2 waiting..\n"
;
ieq10.wait(&mutex);
}
qDebug() <<
"thread2 working..\n"
;
mutex.unlock();
qDebug() <<
"thread2 exit..\n"
;
break
;
}
}
};
int
main(
int
argc,
char
*argv[])
{
QApplication a(argc, argv);
Thread1 t1;
Thread2 t2;
t1.start();
t2.start();
t1.wait();
t2.wait();
return
a.exec();
}
如图所示的运行结果。。当2个线程同时启动是,它们的运行顺序是不确定的;每一次的运行结果都是不一样的