QT之使用QReadWriteLocker互斥量同步线程小例子
2017-09-16 11:44
375 查看
接上一篇,在多线程中基本上都需要解决线程同步问题,本篇文章主要将介绍如何使用QReadWriteLocker互斥量来同步线程。同时,也按照Qt中介绍的另外一种方式来使用多线程,即继承QThread的方式来使用多线程。
这个例子主要目的是:使用两条线程分别读写变量。源代码如下:
【读线程 .h】
【读线程 .cpp】
【写线程 .h】
【写线程 .cpp】
【主函数 .cpp】
本例子主要上介绍 Qt 多线程以及 QReadWriteLock 的使用,基本上没什么难度,就不做过多解释了。
这个例子主要目的是:使用两条线程分别读写变量。源代码如下:
【读线程 .h】
#ifndef READERTHREAD_H #define READERTHREAD_H #include <QThread> #include <iostream> #include <QReadWriteLock> class ReaderThread : public QThread { //虽然要使用信号槽,必须继承 QObject 类且使用 Q_OBJECT 宏, //但这里不需要, 因为 QThread 中已经继承 QObject 并使用了 Q_OBJECT 宏, 重复使用会出现编译错误: error: undefined reference to `vtable for xxxx' //Q_OBJECT public: ReaderThread(); /*重写基类 run 函数*/ virtual void run(); public: int* sum; QReadWriteLock* locker; }; #endif // READERTHREAD_H
【读线程 .cpp】
#include "readerthread.h" ReaderThread::ReaderThread() { } void ReaderThread::run() { for(int i = 0; i < 100; i++) { this->locker->lockForRead(); //QThread::currentThreadId返回的是一个指向线程的void*类型的指针 std::cout << (int)QThread::currentThreadId() << ": " << *sum << std::endl; this->locker->unlock(); } }
【写线程 .h】
#ifndef WRITERTHREAD_H #define WRITERTHREAD_H #include <QThread> #include <iostream> #include <QReadWriteLock> class WriterThread : public QThread { public: WriterThread(); virtual void run(); public: int* sum; QReadWriteLock* locker; }; #endif // WRITERTHREAD_H
【写线程 .cpp】
#include "writerthread.h" WriterThread::WriterThread() { } void WriterThread::run() { while(*sum > 0) { this->locker->lockForWrite(); std::cout << (int)QThread::currentThreadId() << ": " << (*sum)-- << std::endl; this->locker->unlock(); } }
【主函数 .cpp】
#include <QCoreApplication> #include "readerthread.h" #include "writerthread.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int sum = 100; QReadWriteLock locker; /*ReaderThread r1, r2; r1.sum = ∑ r1.locker = &locker; r2.sum = ∑ r2.locker = &locker; r1.start(); r2.start();*/ WriterThread w1, w2; w1.sum = ∑ w1.locker = &locker; w2.sum = ∑ w2.locker = &locker; w1.start(); w2.start(); return a.exec(); }
本例子主要上介绍 Qt 多线程以及 QReadWriteLock 的使用,基本上没什么难度,就不做过多解释了。
相关文章推荐
- QT之使用QMutex/ QMutexLocker互斥量同步线程小例子
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
- QT之使用QSemaphore信号量同步线程小例子
- QT之使用 QWaitCondition 同步线程小例子
- Linux多线程——使用互斥量同步线程
- 使用事件机制同步线程的例子
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- Qt中利用QThread在线程中同步使用QFtp
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- 使用Event同步线程的小例子
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- Linux多线程使用互斥量同步线程
- Linux多线程——使用互斥量同步线程
- 下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况。