多线程中对锁的理解与看法!

66 阅读1分钟
近期,有个项目需要从硬件中读取图像数据,然后使用了接收线程进行处理读取到的数据。在线程中的run内的while循环里面使用到了QMutexLocker锁。
QMutexLocker锁的工作原理,在进行初始化时,进行加锁,然后再析构函数中解锁。锁的作用域与QMutexLocker对象的作用域一致。这个锁无需手动进行加锁与解锁,还算比较好用。代码比其他互斥锁相对简单。
例如:
QMutex mutex;
QMutexLocker locker(&mutex);//既可以在代码块中加锁。
在Qt项目中除了可以使用QMutexLocker锁还有QMutex、QReadLocker/QWriteLocker、std::lock_guard。
**QMutex**
1,Qt提供的互斥锁类。
2,提供lock()/unlock()函数。
3,支持递归锁模式(QMutex::Recursive)
**QReadLocker/QWriteLocker**
1,Qt 的读写锁工具类。
2,基于 QReadWriteLock。
3,允许多个读者或一个写者。
**std::lock_guard**
1,C++11 标准库的 RAII 锁工具。
2,适用于任何满足 BasicLockable 概念的互斥量。
3, 提供最基本的 RAII 功能。
  • 简单互斥需求:使用 QMutexLocker (QMutex 的 RAII 包装)
  • 读多写少场景:使用 QReadLocker/QWriteLocker
  • 跨平台标准代码:使用 std::lock_guard + std::mutex
  • 需要递归锁:使用 QMutex (QMutex::Recursive)
  • 需要手动控制锁:直接使用 QMutex 或 std::mutex