考虑以下情况:
我有一个 QThread 不断修改一个变量(我们称之为counter
)和一个 QTimer 定期读取counter
. 我知道我必须同步可能同时被多个线程修改的变量,但是 - 在这种情况下,当只有一个线程读取和一个线程写入变量时,我是否也需要同步?
考虑以下情况:
我有一个 QThread 不断修改一个变量(我们称之为counter
)和一个 QTimer 定期读取counter
. 我知道我必须同步可能同时被多个线程修改的变量,但是 - 在这种情况下,当只有一个线程读取和一个线程写入变量时,我是否也需要同步?
您描述的场景不安全,您仍然需要同步。Qt 中有几个类可以通过锁定或无锁机制来帮助您。
看看 QMutex、QReadWriteLock、QSemaphore、QWaitCondition、QFuture、QFutureWatcher、QAtomicInt 和 QAtomicPointer。另外你有std::atomic<T>
C++11。
是的,你总是需要同步——如果没有其他原因,标准规定如果存在数据竞争,你的程序有未定义的行为。
您可以与保护计数器变量的互斥锁同步,我认为这是“传统”方式,或者您可以std::atomic<int>
为您的计数器使用一个变量,您可以在不创建数据竞争的情况下访问它。
使用QReadWriteLock保护您的counter
变量。当您在线程中编辑变量时,让他们使用QWriteLocker锁定它,这将锁定任何其他写入或读取的尝试。当您的主线程检查 的值时,使用QReadLocker将其锁定,仅当写锁定当前处于活动状态时才会锁定。counter
counter