Multithreading 如何使用重载函数实现互斥锁 在学习C++和多线程的过程中,我遇到了一个关于如何锁定多线程调用的共享函数的问题。我知道那会帮我完成这项工作。如果在递归函数上使用互斥对象锁,它将创建死锁-清除。此外,对于此类情况,还有一个特殊的解决方案——也很明确
现在我有一组重载函数来为子函数准备数据。那些覆盖的函数将被其他线程调用 我很难找到实现互斥锁的正确方法的答案 示例:互斥锁仅在“Multithreading 如何使用重载函数实现互斥锁 在学习C++和多线程的过程中,我遇到了一个关于如何锁定多线程调用的共享函数的问题。我知道那会帮我完成这项工作。如果在递归函数上使用互斥对象锁,它将创建死锁-清除。此外,对于此类情况,还有一个特殊的解决方案——也很明确,multithreading,c++11,overloading,Multithreading,C++11,Overloading,现在我有一组重载函数来为子函数准备数据。那些覆盖的函数将被其他线程调用 我很难找到实现互斥锁的正确方法的答案 示例:互斥锁仅在“Bar()executing”函数Foo(int,int)上。其他Foo函数将调用Foo(int,int),但其自身缺少锁 #include <thread> #include <mutex> std::mutex m; std::thread th; void one_of_many_threads(void) { // Will c
Bar()
executing”函数Foo(int,int)
上。其他Foo
函数将调用Foo(int,int)
,但其自身缺少锁
#include <thread>
#include <mutex>
std::mutex m;
std::thread th;
void one_of_many_threads(void) {
// Will call one of the Foos ... who knows ...
}
bool Foo(int a, int b) {
bool result;
// Lock for others ...
m.lock();
// Do some checks on a and b before sending to Bar.
// We assume everything is fine ...
result = Bar(a, b);
// Unlock for others ...
m.unlock();
return result;
}
bool Foo(int a) {
return Foo(a, 0);
}
bool Foo(void) {
return Foo(0, 0);
}
bool Bar(int a, int b) {
// Some magic actions with a, b to modify something ...
// will return true for now:
return true;
}
#包括
#包括
std::互斥m;
std::螺纹th;
无效多个线程中的一个线程(无效){
//会打电话给其中一个Foos…谁知道。。。
}
布尔富(内部a、内部b){
布尔结果;
//为他人锁定。。。
m、 锁();
//在发送到酒吧之前,对a和b进行一些检查。
//我们假设一切都很好。。。
结果=巴(a,b);
//为其他人解锁。。。
m、 解锁();
返回结果;
}
布尔福(INTA){
返回Foo(a,0);
}
布尔福(无效){
返回Foo(0,0);
}
布尔条形图(内部a、内部b){
//用a,b来修改一些神奇的动作。。。
//现在将返回true:
返回true;
}
问题1:在Foo()时会导致此问题代码>或Foo(1)代码>由多个线程调用?那些没有锁的,可以被调用,然后变成锁
问题2:因为也可以调用Foo(int,int)
,所以在所有Foo
函数上使用互斥锁将使递归互斥对象成为必要。但若问题1的答案是“无问题!”,那个么在Bar(int,int)
函数上实现互斥有意义吗
谢谢你的回答
问题1:当Foo()时,这将导致问题;或Foo(1);被多个线程调用?那些没有锁的,可以被调用,然后变成锁
不,因为两个Foo函数只调用
bool Foo(int a, int b)
除了“结果”之外,它已经有了一个围绕所有内容的互斥对象。结果呢
是一个局部变量,它不会导致不同线程之间的数据竞争
问题2:因为也可以调用Foo(int,int),所以在所有Foo函数上使用互斥锁将使递归互斥对象成为必要。但若问题1的答案是“并没有问题!”,那个么实现条上互斥(int,int)函数有意义吗
如果Bar只能通过Foo函数调用,那么就不需要在Bar中添加额外的互斥体,因为Bar已经在Foo中的互斥体中了
如果Bar可以在任何地方自由调用(如果它访问/修改一些全局/共享资源),那么是的,您最好放置一个互斥体(即不同的互斥体对象,或者您提到的递归互斥体),以防止竞争条件(以及来自Foo的死锁)
但是,在当前示例中只有局部变量。如果您只打算使用本地对象/副本,则根本不需要任何互斥体。在本例中,我看不出有任何理由使用互斥体,除非您在Bar中通过写入类成员并通过另一个线程读取该类成员来执行一些魔术。。。若是这样的话,在酒吧互斥应该足够了。尝试编写更详细的示例代码。为什么不将互斥锁放在bool栏(inta,intb)
中呢?通常,您希望互斥体尽可能本地化。谢谢您的回答,我会将其标记为有用。在上面的问题中也要考虑@ DOM和@ PHIL1970的注释:将MutX对象放在<代码> BOOL BAR(int a,int b)中是有意义的,以使它尽可能地本地化。