0

2 つの QMutex オブジェクトがあり、両方をロックする必要がありますerase()。しかし、順序は重要ではありません。
そのため、今は 1 つの QMutex がロック解除 ( QMutexLocker locker(&listMutex)) 状態にある間待機し、別の ( ) 状態を待機していQMutexLocker locker(&writeMutex)ます。
ただし、最初にロック解除されるミューテックスを待つ方が効率的です。そして、もう一方を待ちます。よりも待ち時間が短くなります。
そのような動作をどのように実装できますか?
追加の再帰 QMutex または QSemaphore を作成し、両方の QMutex の状態をこの新しいオブジェクトと同期し、QMutex ではなくこの新しいオブジェクトを待つ必要があります。
それはうまくいくはずですが、QMutex オブジェクトを複製せずにもっと簡単な方法があるのではないでしょうか?

class MyQThread:
     public: QThread
{
    ...
    QList<QString> list;
    QString string;
    QMutex listMutex;
    QMutex writeMutex;
}

void MyQThread::erase()
{
     QMutexLocker locker(&listMutex);
     list.clear();
     QMutexLocker locker(&writeMutex);
     string.clear();
}  

void MyQThread::run()
{
     forever
     {
         listMutex.lock();             
         string = list.takeFirst();
         listMutex.unlock();

         writeMutex.lock();
         if(!string.isEmpty())
             ...//do something
         writeMutex.unlock();
     }
}  
4

2 に答える 2

0

並列スレッドでロックを行うことができます。次の例を試してください (私はテストしていません):

class BackgroundLocker : protected QThread {
    protected:
        QMutex& mutex;
        void run() {
            mutex.lock();
        }
    public:
        BackgroundLocker(QMutex& mutex): mutex(mutex) {
            start();
        }
        ~BackgroundLocker(QMutex& mutex) {
            mutex.unlock();
        }
        void waitLock() {
            QThread::wait();
        }
};

void MyQThread::erase() {
    BackgroundLocker locker1(listMutex);
    BackgroundLocker locker2(writeMutex);
    locker1.waitLock();
    locker2.waitLock();
    list.clear();
    string.clear();
}
于 2014-03-14T15:44:11.923 に答える
0

ああ、わかりました...

ちょっと面倒ですが、次のように「tryLock()」を使用できます。

// You could add a loop around this until both are done...

if (listMutex.tryLock())
{
    // list locked... do list stuff
    listMutex.unlock();
}
else if (writeMutex.tryLock())
{
    // writelocked... do writestuff
    listMutex.unlock();
}

注: tryLock は、mutex を実際にロックした場合は true を返し、そうでない場合は false を返します。

---- 編集例 2: ----

// Againm, you can stick a loop around this until you are done...

if (listMutex.tryLock())
{
    // list locked... do list only stuff
}

if (writeMutex.tryLock())
{
    // writelocked... do write only stuff
}

if (listMutex.tryLock() && writeMutex.tryLock())
{
    // Both locked... do write and list stuff
}

// Make sure both are unlocked at the end
listMutex.unlock();
listMutex.unlock();
于 2013-08-22T08:09:22.497 に答える