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