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)中是有意义的,以使它尽可能地本地化。