【问题标题】:QMutex - does this mean I need a global mutex variableQMutex - 这是否意味着我需要一个全局互斥变量
【发布时间】:2013-10-03 06:10:11
【问题描述】:

我需要实现一个有两种工作方式的互斥锁:1. 保护资源免受多个类的影响,以及 2. 保护资源免受类中的方法的影响,该类是插槽并且可能是可重入的。例如(伪 C++):

Class A {
  function aaa() {
    QMutex mutex;
    mutex.lock();
    globalvar++;
    mutex.unlock()
  }
}

Class B {
  function bbb() {
    QMutex mutex;
    mutex.lock();
    globalvar++;
    mutex.unlock()
  }
}
  1. 我读到了this posting,它说场景 2 被覆盖,因为 A.aaa 被 A.aaa 中断处理(不知何故 Qt/OS 知道它是被保护的同一个资源。对吧?

  2. 至于保护同一个资源的 A.aaa 和 B.bbb 我认为它不会起作用,因为 Qt/OS 不知道它的同一个资源/互斥体?这是否意味着变量 mutex 需要是全局变量,以便多个不相关的类可以安全地访问它?

【问题讨论】:

  • Mutex 与受保护的资源相关联,而不是与访问该资源的类相关联。因此,在您的简单情况下,当资源是全局变量时,互斥锁也应该是全局变量。
  • 操作系统对受保护的资源一无所知。在堆栈上创建的不与其他线程共享的互斥锁不会保护任何东西。所有访问 globalvar 的线程必须共享同一个互斥体实例。因此,互斥锁应与要保护的数据在同一范围内。

标签: qt qtcore qmutex


【解决方案1】:

我读到这篇文章说,场景 2 已被涵盖,因为 A.aaa 被 A.aaa 中断处理(不知何故 Qt/OS 知道它是受保护的同一资源。对吧?

是的,尽管在锁定与作用域相关联的这种情况下,您似乎应该使用 QMutexLocker,以避免忘记解锁的错误。这在 C++ 中称为 RAII

严格来说,是QMutex负责锁定资源。

至于 A.aaa 和 B.bbb 保护同一个资源我认为它不会起作用,因为 Qt/OS 不知道它的同一个资源/互斥体?这是否意味着变量 mutex 需要是全局变量,以便多个不相关的类可以安全地访问它?

这是一种罕见的情况,但是是的。尽管您可能希望将全局变量包装成一个类型,例如自定义结构。

【讨论】:

  • 谢谢 - 我将在下一步开始一个新线程来澄清这一点。
  • 那么将全局变量包装在结构中对我有什么好处?
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多