在Qt的多线程控制中,互斥量的访问最简单的控制是添加一个mutex锁,对一个函数或者变量锁定。 这说明只有一个锁,只能被一个QMutex得到,如果QMutex得不到这个锁,那它将不会执行紧随其后的代码,也就是在两个进程代码中需要共用一个QMutex类的实例,这样才能保证该实例是否获取到一个锁或者得不到一个锁。
如果QMutex::lock()得不到这个锁,那么它将会一直等直到得到该锁为止,而另一个方法QMutex::tryLock()可以检测当前是否可以得到这个锁,如果可以得到则返回1,否则返回0(不会一直等,但如果可以得到锁,那就拿到锁,不会光判断而不获取锁),该函数只执行一次,不会一直等到得到锁为止。
QMutex mutex;
int number = 6;
void method1()
{
mutex.lock();
number *= 5;
number /= 4;
mutex.unlock();
}
void method2()
{
mutex.lock();
number *= 3;
number /= 2;
mutex.unlock();
}
QSemaphore提供了一定数量的信号量。
一个 semaphore信号量是一种泛化的mutex。一个mutex只能被锁住一次,但是semaphore被获取多次。信号量通常被用于保护一定数量的同种资源。
Semaphore提供两种基本的操作,acquire() and release():
Acquire(n)尝试去n个资源。如果获取不到足够的资源,这个会一直锁住直到可以获取足够的资源。
Release(n)释放n个资源。
除了以上的方法,还有tryAcquire()函数,如果得不到足够的资源会立即返回,available()函数,返回在任意时刻可用的资源数目。
以下是一个生产者/消费者的例子,可以理解QSemaphore的具体使用
//生产者
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();
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return a.exec();
}