在C#中如果我有一个我可以做的列表
lock (this.mylist)
{
...
}
并且使用该代码我确信没有其他人可以在释放锁之前使用该列表。这在多线程应用程序中很有用。我怎么能在Qt上做同样的事情?我阅读了有关QMutex和QReadWriteLock的文档,但我不明白如何在特定对象上使用它们。
答案 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();
}
现在,lock
和unlock
是原子方法,因此在任何给定时间只有一个线程能够进入临界区。关键是两者都试图访问相同的互斥锁。
所以从本质上讲,这与C#
的工作方式相同,只是你需要自己管理你的互斥体。因此lock(...) { ... }
块被mutex.lock() ... mutex.unlock()
替换。但是,这也意味着,只要您想要访问关键部分项目(例如,在您的示例中为this->mylist
),您就应该使用互斥锁。
修改强>
Qt有很好的文档。您可以在此处详细了解QMutex
:http://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线程实现。