Qt线程同步

时间:2013-04-05 19:56:52

标签: c++ multithreading qt

考虑以下情况:

我有一个不断修改变量的QThread(让我们称之为counter)和一个定期读取counter的QTimer。我知道我必须同步可能同时由多个线程修改的变量但是 - 在这种情况下我是否需要同步,当只有一个线程读取和一个线程写入变量时?

3 个答案:

答案 0 :(得分:4)

您描述的方案不安全,您仍需要同步。 Qt中有几个类可以通过锁定或无锁机制为您提供帮助。

查看QMutex,QReadWriteLock,QSemaphore,QWaitCondition,QFuture,QFutureWatcher,QAtomicInt和QAtomicPointer。另外,你在C ++ 11中有std::atomic<T>

答案 1 :(得分:2)

是的,你总是需要同步 - 如果没有其他原因,标准会说你的程序在数据竞争中有未定义的行为。

您可以与保护计数器变量的互斥锁同步,我认为这是“传统”方式,或者您可以为计数器使用std::atomic<int>变量,您可以在不创建数据竞争的情况下访问该变量

答案 2 :(得分:2)

使用QReadWriteLock保护您的counter变量。当您在线程中编辑counter变量时,让它们用QWriteLocker锁定,这将锁定任何其他写入或读取的尝试。当主线程检查counter的值时,用QReadLocker锁定它,只有当写锁定是当前活动时才会锁定。