multithreading - 互斥锁是否也适用于被调用的函数?

标签 multithreading qt mutex

如果在函数中定义了互斥锁,它的锁是否适用于从该函数调用的函数? IE

void f () {  
    Mutex mutex;  
    g();  
}

该锁是否仍适用于g()中的任何数据修改?

另外,我是否可以说在类方法中定义的锁仅适用于该类的特定实例?意义:
Class Foo;  
Foo foo1, foo2;
(In thread 1) foo1.bar();  
(In thread 2) foo2.bar();  

每个通话都可以同时进行吗?

如果有人可以解释/指出解释互斥量背后的机制的链接,那将是一个不错的奖励。谢谢!如果该信息有帮助,我目前正在使用Qt Thread库。

最佳答案

在您的示例中,您实际上并没有锁定互斥锁,因此它不会阻止不同的线程同时访问该函数。您还可以在函数内部局部声明互斥锁,以便每个函数调用使用不同的局部互斥对象。即使该互斥锁将被锁定,每个函数调用也会锁定一个不同的互斥锁对象,而不是阻止同时访问。

更好的策略是这样的设置:

class A {
  QMutex mutex;

  void f() {  
    QMutexLocker ml(mutex); // Acquire a lock on mutex
    g();

    // The lock on the mutex will be released when ml is destroyed.
    // This happens at the end of this function.
  }

  // ...
};

在这种情况下,只要存在mutexml就会被锁定,因此在线程花费在g()内的时间内也是如此。如果在此期间另一个线程将调用f(),它将阻塞其ml对象的创建,直到第一个线程离开该函数并且新线程可以锁定mutex为止。

关于multithreading - 互斥锁是否也适用于被调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219234/

相关文章:

winapi - 如果应用程序崩溃,是否会在Windows上重置互斥锁?

java - 锁和 .join() 方法之间的区别

iphone - CoreData prepareForDeletion 被调用无限次

c++ - QMetaObject::connectSlotsByName 错误

javascript - Angular.js,从 Angular 外部调用方法后更新 View

c++ - 如何绘制 UML 来说明在临界区工作的 2 个线程

java - Spring AOP 与多线程

c - Delphi 是否有任何等效于 C 的 volatile 变量?

c++ - 如何播放 amr 音频,QMediaPlayer 不支持?

c - 队列数据结构中 isempty 的线程安全实现