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

lock (this.mylist)
{
    ...
}

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

最佳答案

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

所以考虑以下

QMutex mutex;

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

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

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

编辑
Qt有很好的文档。您可以在此处阅读有关QMutex的更多信息:http://doc.qt.io/qt-4.8/qmutex.html

07-25 20:38