如果在函数中定义了互斥锁,它的锁是否适用于从该函数调用的函数? 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.
}
// ...
};
在这种情况下,只要存在
mutex
,ml
就会被锁定,因此在线程花费在g()
内的时间内也是如此。如果在此期间另一个线程将调用f()
,它将阻塞其ml
对象的创建,直到第一个线程离开该函数并且新线程可以锁定mutex
为止。
关于multithreading - 互斥锁是否也适用于被调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219234/