C++ 互斥锁保护的范围是什么?

问题描述 投票:0回答:1

我试图弄清楚互斥体和互斥体lock_guard的范围,但没有人能够向我解释它。 考虑以下 C++ 代码:

void somefunction
{
std::lock_guard<std::mutex> guard(mutex1);
variable1++;

std::lock_guard<std::mutex> guard(mutex2);  //what if I took this mutex out?
variable2++;

/*
long block of code
*/

variable3++;
}

我正在尝试确定互斥锁保护的规则是什么。 例如,在当前代码中,mutex2 是否保护变量 3? 如果我们取出互斥体 2 会怎样? 互斥锁一是否会保护变量 1、2 和 3? 我如何知道互斥体保护什么? 谢谢你

c++ mutex
1个回答
0
投票

当您可以进行实验并亲自了解范围规则如何工作时,无需推测行为。

我稍微修改了您的代码,这样它就不再声明几个

std::lock_guard
对象,而是声明了几个
LetsTryIt
对象...这些对象使用有用的消息调用
printf()
,以便我们可以看到互斥体在哪里会在真实代码中被锁定/解锁。 我还在
main()
内的各个点添加了一些 printf() 调用,以使执行顺序更加明显。

这是修改后的代码:

#include <stdio.h>

class LetsTryIt
{
public:
   LetsTryIt(const char * desc) : _desc(desc)
   {
      printf("LetsTryIt ctor [%s] ... lock would occur here\n", _desc);
   }

   ~LetsTryIt()
   {
      printf("LetsTryIt dtor [%s] ... ulock would occur here\n", _desc);
   }

private:
   const char * _desc;
};

int main(int, char**)
{
   int variable1=0, variable2=0, variable3=0;

   printf("Step 1\n");

   LetsTryIt guard1("mutex1");
   variable1++;

   printf("Step 2\n");

   LetsTryIt guard2("mutex2");
   variable2++;

   printf("Step 3\n");
   /*
   long block of code
   */

   variable3++;

   printf("Step 4\n");

   return 0;
}

...这是我运行测试程序时看到的输出:

$ ./a.out
Step 1
LetsTryIt ctor [mutex1] ... lock would occur here
Step 2
LetsTryIt ctor [mutex2] ... lock would occur here
Step 3
Step 4
LetsTryIt dtor [mutex2] ... ulock would occur here
LetsTryIt dtor [mutex1] ... ulock would occur here

希望这能够明确范围规则是什么;如果没有,请告诉我,我可以尝试进一步澄清。

© www.soinside.com 2019 - 2024. All rights reserved.