Qt多线程同步总结

1、QMutex

QMutex mutex;

void func()

{

mutex.lock();

........

mutex.unlock();

}

2、QMutex联手QMutexLocker

在复杂函数或者异常处理中,对mutex进行lock()和unlock()操作将会很复杂,进入点要lock(),在所有跳出点都要unlock(),想想都蛋疼!忘记unlock()将是很苦逼的事情,所以Qt引进了QMutexLocker来避免lock()和unlock()操作。

QMutex mutex;

void complexFunc()

{

QMutexLocker locker(&mutex);//在函数需要的地方建立QMutexLocker对象,并把mutex指针传进来就好了,后面什么事情也不用做了,等到退出函数后,这个QMutexLocker对象局部变量会自己销毁,销毁了就解锁了。方便吧。当然,你也可以调用locker.unlock()给mutex解锁,然后再调用locker.relock()再锁住mutex。也可以调用locker.mutex()获取建立locker时引入的那个mutex的指针。是不是很方便?

..........

............

}

3、QReadWriteLock

这个允许多个进程同时读,但是只有一个写。而且写读不能同时进行。

QReadWriteLock lock;

void write()

{

lock.lockForWrite();//为写而锁

..........

lock.unlock();//解锁

}

void read()

{

lock.lockForRead();//为读而锁

..............

lock.unlock();//解锁

}

4、QReadWriteLock联手QReadLocker和QWriteLocker

这个有点类似于QMutex和QMutexLocker。也是为了避免那些复杂的lockForRead()/lockForWrite()和unlock()操作,要是程序流程复杂起来实在是很让人小心谨慎到蛋疼。但是联手QReadLocker和QWriteLocker后就不一样了。

QReadWriteLock lock;

void write()

{

QReadLocker locker(&lock);

..........

}

void read()

{

QWriteLocker locker(&lock);

..............

}

QReadLocker和QWriteLocker的成员函数都一模一样,退出函数的时局部变量locker会自动销毁,讲lock自动解锁。也可以调用locker.unlock()给lock解锁,然后再调用locker.relock()再锁住lock。也可以调用locker.readWriteLock()获取建立locker时引入的那个lock的指针。

5、QSemaphore

它的成员函数是

QSemaphore ( int n = 0 )//建立对象时可以给它n个资源

~QSemaphore ()

void acquire ( int n = 1 )// 这个操作一次减少n个资源,如果现有资源不到n个就会阻塞

int available () const   //返回当前可用的QSemaphore资源个数

void release ( int n = 1 )//这个操作一次增加n个资源

bool tryAcquire ( int n = 1 )//类似于acquire,但是申请不到n个资源时不会阻塞会立即返回

bool tryAcquire ( int n, int timeout )

下面举生产者-消费者例子说明

const int DataSize = 100000;//要生产的数据个数

const int BufferSize = 8192;//用于盛数据的缓存大小

char buffer[BufferSize];

//要定义两个信号量,一个用于表示自由空间,一个用于表示已用空间

QSemaphore freeBytes(BufferSize);//自由空间初始化大小当然等于缓存大小啦

QSemaphore usedBytes;

class Producer : public QThread

{

public:

void run();

};

void Producer::run()

{

qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

for (int i = 0; i < DataSize; ++i) {

freeBytes.acquire();//申请一个自由空间,没有就阻塞

buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];

usedBytes.release();//已用空间增加一个,有货啦!

}

}

class Consumer : public QThread

{

public:

void run();

};

void Consumer::run()

{

for (int i = 0; i < DataSize; ++i) {

usedBytes.acquire();

fprintf(stderr, "%c", buffer[i % BufferSize]);

freeBytes.release();

}

fprintf(stderr, "\n");

}

int main(int argc, char *argv[])

{

QCoreApplication app(argc, argv);

Producer producer;

Consumer consumer;

producer.start();

consumer.start();

producer.wait();

consumer.wait();

return 0;

}

6、QWaitCondition

QWaitCondition最大的好处,我觉得,是能在一个线程中唤醒一个或多个其它线程,当然前提是,其它线程在等待某个QWaitCondition,否则不起作用,你唤醒也没用。QWaitCondition必须与QMutex或者QReadwriteLock一起用。

时间: 2024-08-07 12:29:38

Qt多线程同步总结的相关文章

Qt 多线程同步 与 通信

转自网络 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWriteLocker.QReadLocker.QWriteLocker,但线程同步是应用很少,这里只做简单的讲解! QMutex.QMutexLocker QMutex类提供了一个保护一段临界区代码的方法,他每次只允许一个线程访问这段临界区代码.QMutex::lock()函数用来锁住互斥量,如果互斥量处于解锁状态,当前

Qt多线程(有详细例子)

Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex  提供相互排斥的锁,或互斥量QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁QReadWriterLock 提供了一个可以同时读操作的锁QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock加锁与解锁QSemaphore 提供了一个整型信号量,是互斥量的泛化QWaitConditio

QT多线程[转]

Qt作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt提供了丰富的多线程编程支持.从 2.2 版本开始,Qt主要从下面三个方面对多线程编程提供支持:一.构造了一些基本的与平台无关的线程类:二.提交用户自定义事件的 Thread-safe方式:三.多种线程间同步机制,如信号量,全局锁.这些都给用户提供了极大的方便.不过,在某些情况下,使用定时器机制能够比利用 Qt本身的多线程机制更方便地实现所需要的功能,同时也避免了

Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)

Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法. 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的.推荐阅读: Threads Primer: A Guide to Multithreaded Programming Thread Time: The Multithreaded Programming Guide Pthreads Programming: A POSIX Standard for Be

Qt 多线程和网络编程学习

一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run()函数是在start()函数调用之后开始执行 QMutex类,互斥量/互斥锁,加锁解锁,原子操作 QWaitCondition类,一个线程在一定条件下等待其它线程的唤醒,在此之前一直处于休眠期.QWaitCondition::wakeOne()随机唤醒一个等待的线程,QWaitCondition::

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

Qt 多线程程序设计

看到一篇好文章,特地转载下来,很详细很全面,收藏之. 原文地址:  http://blog.21ic.com/user1/1425/archives/2009/64057.html QT 多线程程序设计 QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中

Qt多线程-QThread

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2017/12/592/ 文章目录 1. 介绍  1.1. 线程优先级  1.2. 线程休眠 2. 基本使用  2.1. 建立QThread子类法  2.2. moveToThread方法 3. 线程同步  3.1. QMutex互斥量  3.2. QMutexLocker  3.3. QReadWr

Java多线程同步机制

Java的多线程同步机制和其他语言开发的是一样的,在当前线程中,遇到某个事件时,等待另一个线程运行结束或者另一个线程的事件,然后再决定如何处理. 本例来自书上的实例,精简了代码,调整了部分逻辑,使得看起来更加简洁明了.已经运行通过. 代码如下: package SwingExample; import java.awt.BorderLayout; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPro