#include "threadclock.h" #include "GlobalData.h" #include #include #include #include #include QMutex mutex(QMutex::Recursive);//默认那种方式不行,另一个线程不会阻塞等待 QReadWriteLock rwLock(QReadWriteLock::Recursive); QMutex mutexCon;//配合等待条件,不能用上面那种 QWaitCondition condition; //信号量 QSemaphore sem(8); ThreadClock::ThreadClock(QObject *parent) : QThread{parent} { ; } QString ThreadClock::name() const { return m_name; } void ThreadClock::setName(const QString &newName) { m_name = newName; } #if 1 void ThreadClock::run() { mutex.lock(); while (g_count < 5) { g_count++; qDebug() << m_name << g_count; sleep(1); } g_count = 0; mutex.unlock(); } #endif #if 0 /* "2thread" 2 "1thread" 1 "1thread" 4 "2thread" 4 "2thread" 0 "2thread" 1 "2thread" 2 "2thread" 3 "2thread" 4 "2thread" 5 */ //可见读锁在线程之间是不阻塞的 void ThreadClock::run() { rwLock.lockForRead(); while (g_count < 5) { g_count++; qDebug() << m_name << g_count; sleep(1); } g_count = 0; rwLock.unlock(); } #endif #if 0 /* "1thread" 1 "1thread" 2 "1thread" 3 "1thread" 4 "1thread" 5 "2thread" 1 "2thread" 2 "2thread" 3 "2thread" 4 "2thread" 5 */ //读写锁之间是阻塞的 void ThreadClock::run() { if (m_name == "1thread") { rwLock.lockForRead(); }else { rwLock.lockForWrite(); } while (g_count < 5) { g_count++; qDebug() << m_name << g_count; sleep(1); } g_count = 0; rwLock.unlock(); } #endif #if 0 //QWaitCondition的使用 注意:无限循环 void ThreadClock::run() { //生产者 if (m_name == "1thread") { while (true) { mutexCon.lock(); g_count++;//生产 qDebug() << m_name << g_count;//生产的数据 condition.wakeAll();//唤醒其它线程(可以消费) mutexCon.unlock(); } }else{//消费者 while (true) { mutexCon.lock(); while (g_count <= 0) {//说明生产者还没有生产数据 condition.wait(&mutexCon);//等待生产者生产完成,解锁 } qDebug() << m_name << g_count;//消费的数据 g_count--;//消费 mutexCon.unlock(); } } } #endif /* "1thread" 0 "1thread" 1 "1thread" 2 "1thread" 3 "1thread" 4 "1thread" 5 "1thread" 6 "1thread" 7 这里已经满了,无法生产了 "2thread" 0 消费一个之后 "1thread" 8 才能继续生产 "2thread" 1 "1thread" 9 "2thread" 9 */ #if 0 //信号量的使用 注意:无限循环 void ThreadClock::run() { //生产者 if (m_name == "1thread") { while (true) { sem.acquire(1); g_bufferData[g_count % 8] = '0' + g_count;//这里把g_count当成索引 qDebug() << m_name << g_bufferData[g_count % 8];//生产的数据 g_count++; } }else{//消费者 while (true) { qDebug() << m_name << g_bufferData[g_count % 8];//消费的数据 sem.release(1); } } } #endif