我试图弄清楚互斥体和互斥体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? 我如何知道互斥体保护什么? 谢谢你
当您可以进行实验并亲自了解范围规则如何工作时,无需推测行为。
我稍微修改了您的代码,这样它就不再声明几个
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
希望这能够明确范围规则是什么;如果没有,请告诉我,我可以尝试进一步澄清。