首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果QMutex很少,则等待第一个解锁的QMutex

如果QMutex很少,则等待第一个解锁的QMutex
EN

Stack Overflow用户
提问于 2013-08-22 14:42:19
回答 2查看 590关注 0票数 0

我有两个QMutex对象,我需要锁定它们,erase()方法。但是顺序并不重要。

因此,现在我在等待一个QMutex处于解锁(QMutexLocker locker(&listMutex))状态,然后等待另一个(QMutexLocker locker(&writeMutex))。

但是等待第一个被解锁的互斥锁会更有效率。然后等待另一个。这样等待的时间就会更短。

如何实现这样的行为呢?

我是否应该创建额外的递归QMutex或QSemaphore,并将这两个QMutex的状态与这个新对象同步,然后等待这个新对象而不是我的QMutex。

这应该是可行的,但也许有一种不复制QMutex对象的更简单的方法?

代码语言:javascript
复制
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();
     }
}  
EN

回答 2

Stack Overflow用户

发布于 2013-08-22 16:09:22

啊好吧..。

这有点麻烦,但你可以使用"tryLock()",就像这样:

代码语言:javascript
复制
// 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实际锁定了互斥锁,则返回true,否则返回false。

-编辑示例2:

代码语言:javascript
复制
// 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();
票数 0
EN

Stack Overflow用户

发布于 2014-03-14 23:44:12

您可以在并行线程中进行锁定。请尝试下面的示例(我没有测试它):

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18373389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档