0

我有两个 QMutex 对象,我需要将它们都锁定,erase()方法。但顺序并不重要。
所以,现在我正在等待一个 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 确实锁定了互斥锁,则 tryLock 将返回 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 回答