1. 程式人生 > >對生產者和消費者問題的另一個解決辦法是使用QWaitCondition(封裝好了wakeOne,wakeAll,而且與QReadWriteLock對接,幾乎是萬能的辦法)

對生產者和消費者問題的另一個解決辦法是使用QWaitCondition(封裝好了wakeOne,wakeAll,而且與QReadWriteLock對接,幾乎是萬能的辦法)

thread wak clu cor int csdn 但是 targe get

對生產者和消費者問題的另一個解決辦法是使用QWaitCondition,它允許線程在一定條件下喚醒其他線程。其中wakeOne()函數在條件滿足時隨機喚醒一個等待線程,而wakeAll()函數則在條件滿足時喚醒所有等待線程。

1、bool wait (QMutex * mutex,unsigned long time = ULONG_MAX) 1) 釋放鎖定的mutex
2) 在線程對象上等待

mutex必須由調用線程進行初鎖定 。註意調用wait的話,會自動調用unlock解鎖之前鎖住的資源,不然會造成死鎖。線程1等待線程2來改變共享資源,從而達到一定的條件然後發出信號,使得線程1從wait中的阻塞狀態中被喚醒。但是線程2想改變資源,卻無法辦到,因為線程1調用lock之後就在wait中blocking,了但是沒有及時的unlock,那麽這就構成了死鎖的條件。所以說wait函數除了使調用線程切換到內核態之外,還自動unlock(&mutex)。

2、void wakeOne ()
這將會喚醒所有等待QWaitCondition的線程。這些線程被喚醒的順序依賴於操組系統的調度策略,並且不能被控制或預知。

3、void wakeAll ()

這將會喚醒所有等待QWaitCondition的線程中的一個線程。這個被喚醒的線程依賴於操組系統的調度策略,並且不能被控制或預知。

  下面通過一個典型用例:生產者和消費者,來實現這二者之間的同步。整個工程就一個main.cpp,文件如下:

技術分享圖片
#include <QtCore/QCoreApplication>
#include <QWaitCondition>
#include <QThread>
#include <QMutex>
#include <iostream>

const int DataSize = 100;
const int BufferSize = 1;
char buffer[BufferSize];

QWaitCondition bufferIsNotFull;
QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace  = 0;

class Producer : public QThread
{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();
            while (usedSpace == BufferSize)
            {
                bufferIsNotFull.wait(&mutex);
            }
            std::cerr<<"P";
            ++usedSpace;
            bufferIsNotEmpty.wakeAll();
            mutex.unlock();
        }
    }
};

class Consumer : public QThread
{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();
            while (usedSpace == 0)
            {
                bufferIsNotEmpty.wait(&mutex);
            }
            std::cerr<<"C";
            --usedSpace;
            bufferIsNotFull.wakeAll();
            mutex.unlock();
        }
        std::cerr<<std::endl;
    }
};

int main(int argc, char *argv[])
{
   Producer producer;
   Consumer consumer;
   producer.start();
   consumer.start();
   producer.wait();
   consumer.wait();
return 0;
}

https://blog.csdn.net/skc361/article/details/19409527

對生產者和消費者問題的另一個解決辦法是使用QWaitCondition(封裝好了wakeOne,wakeAll,而且與QReadWriteLock對接,幾乎是萬能的辦法)