它是安全的锁/范围防护实施吗?

Ars*_*min 1 c++ multithreading

现在我从类中获得了线程安全字段的实现:

int A::GetValue() const
{
    _mutex.Lock();
    int temp = _value;
    _mutex.Unlock();
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

我想用这样的锁/范围保护实现替换它(LockGuard类只有构造函数/析构函数和Mutex*_mutex字段):

LockGuard::LockGuard(Mutex & mutex) : _mutex(&mutex)
{
    _mutex->Lock();
}

LockGuard::~LockGuard()
{
    _mutex->Unlock();
}
Run Code Online (Sandbox Code Playgroud)

并重构代码:

int A::GetValue() const
{
    LockGuard lockGuard(_mutex);
    return _value;
}
Run Code Online (Sandbox Code Playgroud)

我突然意识到我不确定这是否安全实施.是否保证首先将_value的副本传递出函数,并且只有已经存在此副本的_mutex才会被解锁?请不要提供C++ 11替代实现示例 - 我有嵌入式系统,不幸的是不能使用它们.

Jer*_*ner 5

这行是个问题:

LockGuard(_mutex);
Run Code Online (Sandbox Code Playgroud)

它应该是:

LockGuard foo(_mutex);
Run Code Online (Sandbox Code Playgroud)

否则它将超出范围并在方法的其余部分执行之前解锁您的互斥锁.(您可以通过在LockGuard构造函数和析构函数以及调用方法中临时插入printf或类似函数来验证有问题的行为).

除此之外你的锁定模式是好的.