locker_locker room_money locker

电脑杂谈  发布时间:2016-12-26 10:01:56  来源:网络整理

money locker_locker_locker room

QMutexLocker用来简化互斥量的锁定和解锁操作。

在复杂函数或者异常处理代码中互斥量的锁定和解锁容易出错和难以调试。QMutexLocker就可以应用于这些情况,确保互斥量状态总是定义明确。

应该在程序中QMutex需要被锁定处创建QMutexLocker。当QMutexLocker被创建后,互斥量就锁定了。你可以使用unlock()和relock()来解锁和再次锁定互斥量。locker如果互斥量被锁定,当QMutexLocker销毁的时候,自动实现互斥量的解锁。

例如:在这个函数中,进入函数开始处锁定互斥量,在各个退出点解锁互斥量

int complexFunction(int flag)

{

mutex.lock();

int retVal = 0;

switch (flag) {

case 0:

case 1:

retVal = moreComplexFunction(flag);

break;

case 2:

{

int status = anotherFunction();

if (status < 0) {

mutex.unlock();

return -2;

}

retVal = status flag;

}

break;

default:

if (flag > 10) {

mutex.unlock();

return -1;

}

break;

}

mutex.unlock();

locker room_money locker_locker

return retVal;

}

当这个示例函数变得更复杂的时候,将增加出错的可能性。

使用QMutexLocker大大地简化代码,增加代码可读性

int complexFunction(int flag)

{

QMutexLocker locker(&mutex);

int retVal = 0;

switch (flag) {

case 0:

case 1:

return moreComplexFunction(flag);

case 2:

{

int status = anotherFunction();

if (status < 0)

return -2;

retVal = status flag;

}

break;

default:

if (flag > 10)

return -1;

break;

}

return retVal;

}

现在,当QMutexLocker 对象被销毁的时候,就自动实现互斥量的解锁(因为QMutexLocker 是个局部变量,当函数返回时它就被销毁)。

这原则同样适用于抛出和捕获异常的代码。在异常处理函数中,如果互斥量已经被锁定,但是在异常被抛出之前还没有其他的地方解锁互斥量,那么异常将不被捕获。

QMutexLocker也提供了一个mutex()成员函数返回QMutexLocker操作的互斥量。对于需要访问互斥量是十分有用的,比如QWaitCondition::wait()。

例如:

class SignalWaiter

{

private:

QMutexLocker locker;

public:

SignalWaiter(QMutex *mutex): locker(mutex)

{

}

void waitForSignal()

{

...

while (!signalled)

waitCondition.wait(locker.mutex());

...

}

};

请参考 QReadLocker, QWriteLocker, 和 QMutex.

成员函数说明

QMutexLocker::QMutexLocker ( QMutex * mutex )

构造一个QMutexLocker对象并锁住互斥量。当QMutexLocker被销毁的时候,互斥量将被自动解锁。locker如果互斥量为0,QMutexLocker不起作用。

请参考 QMutex::lock().

QMutexLocker::~QMutexLocker ()

销毁QMutexLocker并且解锁在它构造函数中被锁定互斥量

请参考QMutex::unlock().

QMutex * QMutexLocker::mutex () const

返回在QMutexLocker构造函数中被锁定的互斥量

void QMutexLocker::relock ()

锁定一个解锁状态的互斥量

请参考 unlock().

void QMutexLocker::unlock ()

解锁互斥量。你可以使用relock()再次锁定它。当销毁的时候互斥量不应该被锁定。

请参考 relock()


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-23436-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 畅游
        畅游

        我喜欢他们这种

        • 阿信
          阿信

          美国船这样远的来参观中国南海建设

      • 王文彦
        王文彦

        你想成为第几个死的

      • 王恩东
        王恩东

        特么不小心插上电源

      热点图片
      拼命载入中...