Qt多线程2

200 阅读1分钟

我们可以认为,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();`

它可以在退出作用域以后就自动释放锁。

关于多线程还有信号量机制,该机制的作用一般在某些特别的场合,例如常见的生产者消费者问题,这类问题以后我们再谈,它的机制很简单,但是需要一定的逻辑概念。