Qt中管理多线程的方式有很多,其中典型的生产者消费者模型中应用信号量机制,这个方式在Qt中封装在一个名为QSemaphore的类中。
应用中使用连个信号量,一个作为生产者,另一个作为消费者,类似于哨兵,在第一个进程中将信号填满,第二个进程中将信号消耗,不多说了,上代码。
QSemaphore sema_product(10); //定义生产者信号容量为10.
QSemaphore sema_consumer(0); //消费者初始容量为0,等待生产者注入信号.
void thread2::run()
{
for (int i = 0; i < 100; i++)
{
sema_product.acquire(); //获取一个单位,获取一个少一个,在这个线程里product信号
//只会被消耗,在另一个线程里补充。
int st = ++stat_value;
sema_consumer.release(); //消费者容量释放1。
}
}
void thread1::run()
{
while (true)
{
sema_consumer.acquire(); //当sema_consumer被生产者release之后才能acquire,
//缺省为1个单位
int str = --stat_value;
sema_product.release(); //同时为sema_product释放一个单元
}
}
这是一个示意代码,其中注意QSemaphore::acquire()会一直等到可以获取一个单元为止,可以利用tryAcquire()尝试一次,如果能获取到单元则继续,如果不能就返回false。
该类中的release()函数为释放单元,无下限,如:QSemaphore::release(10)则为对应实例提供释放出10个可用单元,还可以继续释放可用单元。所以生产着消费者模式中通常使用两个QSemaphore实例进行互相更新信号量。