2

考虑以下情况:

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

4

3 回答 3

4

您描述的场景不安全,您仍然需要同步。Qt 中有几个类可以通过锁定或无锁机制来帮助您。

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

于 2013-04-05T20:19:37.440 回答
2

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

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

于 2013-04-05T20:20:40.643 回答
2

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

于 2013-04-05T20:26:15.763 回答