在C#中,如果我有一个列表,我可以做
lock (this.mylist)
{
...
}
并使用该代码确保在释放锁之前没有其他人可以使用该列表。这在多线程应用程序中很有用。我如何在Qt上做同样的事情?我阅读了有关QMutex和QReadWriteLock的文档,但不了解如何在特定对象上使用它们。
最佳答案
要使用QMutex
(或C / C++中的任何标准同步方法),所有相互依赖的关键部分都必须了解互斥体。确保这一点的最简单的方法(但是,不是C++中的最佳实践,即使其成为类成员或类似的东西),是创建全局变量互斥量(例如,我们将这样做)。
所以考虑以下
QMutex mutex;
void someMethod()
{
mutex.lock();
// Critical section
mutex.unlock();
}
现在,
lock
和unlock
是原子方法,因此在任何给定时间只有一个线程将能够进入关键部分。关键是两者都试图访问相同的互斥量。因此,从本质上讲,这与
C#
相同,但您需要自己管理互斥锁。因此lock(...) { ... }
块被mutex.lock() ... mutex.unlock()
代替。但是,这也意味着,只要您想访问关键部分的项(例如,在示例中为this->mylist
),就应该使用互斥体。编辑
Qt有很好的文档。您可以在此处阅读有关
QMutex
的更多信息:http://doc.qt.io/qt-4.8/qmutex.html