我有两个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();
}
} 发布于 2013-08-22 16:09:22
啊好吧..。
这有点麻烦,但你可以使用"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实际锁定了互斥锁,则返回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();发布于 2014-03-14 23:44:12
您可以在并行线程中进行锁定。请尝试下面的示例(我没有测试它):
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();
}https://stackoverflow.com/questions/18373389
复制相似问题