像Q#一样锁定Qt中的对象

时间:2012-04-25 16:16:19

标签: c++ qt4 locking

在C#中如果我有一个我可以做的列表

lock (this.mylist)
{
    ...
}

并且使用该代码我确信没有其他人可以在释放锁之前使用该列表。这在多线程应用程序中很有用。我怎么能在Qt上做同样的事情?我阅读了有关QMutex和QReadWriteLock的文档,但我不明白如何在特定对象上使用它们。

3 个答案:

答案 0 :(得分:2)

使用RAII的一般C ++方法就是使用RAII,所以最终得到这样的代码:

// Inside a function, a block that needs to be locked
{
  QMutexLocker lock(&mutex); // locks mutex
  // Do stuff

  // "QMutexLocker" destructor unlocks the mutex when it goes out of scope
}

我不知道如何转换为Qt,但如果没有原生支持,你可能会写一个帮助类。

编辑:感谢Cory,你可以看到Qt很好地支持这个成语。

答案 1 :(得分:1)

要使用QMutex(或C / C ++中的任何标准同步方法),所有彼此依赖的关键部分必须知道互斥锁。最简单的(但不是C ++的最佳实践,即使其成为类成员或其他东西)确保这一点的方法是创建一个全局变量互斥体(我们将这样做)。

请考虑以下

QMutex mutex;

void someMethod()
{
  mutex.lock();
  // Critical section
  mutex.unlock();
}

现在,lockunlock是原子方法,因此在任何给定时间只有一个线程能够进入临界区。关键是两者都试图访问相同的互斥锁。

所以从本质上讲,这与C#的工作方式相同,只是你需要自己管理你的互斥体。因此lock(...) { ... }块被mutex.lock() ... mutex.unlock()替换。但是,这也意味着,只要您想要访问关键部分项目(例如,在您的示例中为this->mylist),您就应该使用互斥锁。

修改 Qt有很好的文档。您可以在此处详细了解QMutexhttp://doc.qt.io/qt-4.8/qmutex.html

答案 2 :(得分:0)

在C ++ 11中,你可以这样做:

#include <thread>
#include <mutex>

std::mutex mut;

void someMethod()
{
  std::lock_guard(mut);
  // Critical section
}

这是RAII的习惯用语 - 锁定保护是一个对象,无论someMethod范围如何退出(正常返回或抛出),都会释放锁定。请参阅Anthony Williams的C ++ concurrency In Action。他还有一个C++11 thread implementation。 C ++ 11实现非常类似于boost线程实现。