基于 previous question :
我对线程之间共享的不同变量进行了一些冗长的赋值。将这些分配拆分到单个作用域以防止单个 lock_guard 占用所有变量是否有意义?
如果前一个线程移动到第二个作用域,则下一个线程可以使用第一个变量。
我的猜测是,这取决于被调用函数的复杂性。如果您只有一个分配,它肯定比使用第二个 lock_guard 锁定/解锁另一个互斥锁要快。
伪代码
// all used variables beside the lock_guards are created and initialized somewhere else
// do something ...
{
std::lock_guard<std::mutex> lock(mut0);
shared_var0 = SomeFunctionTakingSameTime0();
}
{
std::lock_guard<std::mutex> lock(mut1);
shared_var1 = SomeFunctionTakingSameTime1();
}
// do this again or other stuff ...
这种类型的代码结构有哪些优点或缺点?
最佳答案
根据您的描述,我认为 SomeFunctionTakingSameTime0()
是一个有点耗时的函数。但与共享变量交互的唯一方式是赋值。因此,最好这样做:
auto temp = SomeFunctionTakingSameTime0();
{
std::lock_guard<std::mutex> lock(mut0);
shared_var0 = std::move(temp);
}
由于您为锁提供了两个不同的互斥体 mut0
和 mut1
,因此您能做的最好的事情就是分别获取它们。
关于c++ - 多个变量的多个互斥体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470644/