c++ - 多个变量的多个互斥体

标签 c++ multithreading locking mutex

基于 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);  
}

由于您为锁提供了两个不同的互斥体 mut0mut1,因此您能做的最好的事情就是分别获取它们。

关于c++ - 多个变量的多个互斥体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470644/

相关文章:

c# - ReaderWriterLockSlim 与 Monitor

java - 在并发应用程序设计中使用 Lock 接口(interface)如何提供比使用 synchronize 关键字更高的性能?

ruby-on-rails - ruby on rails 是否在锁定事件记录时自动锁定事件记录关联?

c++ - 焦炭中的垃圾

C++ 条件变量指示分离线程执行停止的结束

c++ - 调用 operator= 方法时抛出 std::bad_alloc 异常 C++

仅包含指针的对象的 c++ 未使用内存,如何释放?

c++ - 这个锁的内存屏障是否正确?

php - 为什么 phpseclib 生成不兼容的证书?

c++ - QprogressBar 在一秒内从 0 跳到 100,如何使其平滑