Qt多线程2
我们可以认为,DebugText对象是一个临界资源,即一次只能有一个线程来使用。临界区资源必须要互斥访问,不然就会出现各种Bug。
使用QMutex类的相关功能可以保证一次只有一个线程使用该代码段。
我们在DebugText类里面加入下面这句声明:
QMutex *mutexInDebugText;
然后再构造函数中:
mutexInDebugText = new QMutex;
接下来,我们再在addContents中加入下面的话:
void DebugText::addContents(const QString& s1)
{
mutexInDebugText->lock();
ShowDebugArea->append(s1);
show();
mutexInDebugText->unlock();
}
然后我们在主函数中再把程序改成第一次运行的样子:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MultiThread mythread;
mythread.start();
//mythread.terminate();
int i = 10;
while (i--) {
DebugText::getDebugText()->addContents("bbbbbb");
}
//QThread::sleep(100);
return a.exec();
}
现在,bbbbbbbb 和 aaaaaaaa 是交替打印出来的。
说明我们的类设计成功了。
现在,我们再用另一种方式:
我们把addContents函数里面再改为:
QMutexLocker locker(mutexInDebugText);
//mutexInDebugText->lock();
ShowDebugArea->append(s1);
show();
//mutexInDebugText->unlock();
它可以在退出作用域以后就自动释放锁。
关于多线程还有信号量机制,该机制的作用一般在某些特别的场合,例如常见的生产者消费者问题,这类问题以后我们再谈,它的机制很简单,但是需要一定的逻辑概念。