我正在尝试优化一些多线程代码。我知道我应该关注的方法是减小关键部分的大小,但是我遇到了一些代码结构,因此我不确定提高性能的最佳方法是什么。

第一个问题是这样的:

mutex.lock();
critical Section A;
func_A(); //func_A() is just a function which will not create confliction.
critical Section B;
mutex.unlock();


func_A()只是一个不会产生冲突的函数。
我将A和B视为整个关键部分,如果将​​其拆分,可以说使A和B不在同一关键部分,例如:

mutex.lock();
critical Section A;
mutex.unlock();
func_A(); //func_A() is just a function which will not create confliction.
mutex.lock();
critical Section B;
mutex.unlock();


这会改善我的代码性能吗?

第二个问题是我有一些类似的代码:

func1(){
    mutexA.lock();
    critical Section for varibale A;
    mutexB.lock();
    critical Section for varibale B;
    mutexB.unlock();
    critical Section for varibale A;
    mutexA.unlock();
}
func2(){
    if (some condition){
      mutexB.lock();
      critical Section for varibale B;
      mutexB.unlock();
    }
}


这里func1是一个耗时的函数,而func2不是。
同样,变量B的临界区是很快的部分。

可以将一个锁放到另一个锁中吗?会不会对性能产生太大影响?将func1和func2都使用一个互斥锁而不是2是否可以使用?

真的很难弄清楚这些互斥量将要花费多少。我真的不知道他们。

最佳答案

首先,保持简单但正确。然后进行配置。然后,仅在需要时进行改进。

不幸的是,由于以下原因,我无法提供更具体的答案:

mutex.lock();
critical Section A;
database.loadPetabyteOfData() // just a single line
critical Section B;
mutex.unlock();


在这里,这很有意义。如果您的“不会造成冲突的几条线”很快-不要打扰。

关于最后一个关于为每个变量使用单独的互斥锁的示例:通常这也没有意义。如果通常一起修改一堆变量,请使用相同的互斥锁来保护它们。从一个简单的版本开始。

关于c++ - 这样可以提高将关键部分分割并两次锁定互斥锁的性能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57299132/

10-11 22:30
查看更多