gpt4 book ai didi

c++ - std::lock_guard 构造函数实例化顺序

转载 作者:行者123 更新时间:2023-11-30 01:38:09 24 4
gpt4 key购买 nike

我认为这是关于左值实例化排序的更普遍的问题。

简而言之,这安全吗?:

void func1()
{
std::lock_guard< std::mutex > lock( mutex );
//do some stuff in locked context
}

void func2()
{
func1();
std::lock_guard< std::mutex > lock( mutex );
//do some stuff in locked context
}

我有点担心编译器可能会在从 func2 中调用 func1 之前调用 lock_guard 的构造函数,从而导致死锁。

是否保证这是安全的,或者我是否需要做这样的事情:

void func1()
{
std::lock_guard< std::mutex > lock( mutex );
//do some stuff in locked context
}

void func2()
{
func1();

{ //lock
std::lock_guard< std::mutex > lock( mutex );
//do some stuff in locked context
} //unlock
}

最佳答案

您所描述的那些内容(函数调用和锁的实例化)在标准中称为完整表达式。

根据C++11 1.9程序执行/14(C++14中的位置和文本相同,C++17 4.6中的相同文本程序执行/16):

Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.

在某些情况下,看似顺序的操作可以不确定地排序,但这不是其中之一。


顺便说一句,如果您担心单个执行线程可能会尝试两次重新获取同一个互斥锁,那么您可能会发现 recursive_mutex 派上用场.


另外,在您询问 C++98 和 C++03 的评论中,线程仅在 C++11 中引入。在此之前,C++ 仍然按照 C 的方式使用序列点的概念。

C++98 1.9程序执行/16C++03 1.9程序执行/16中,您会发现类似的措辞:

There is a sequence point at the completion of evaluation of each full-expression.

关于c++ - std::lock_guard 构造函数实例化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48512379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com