C++ lambda 中的互斥锁会导致崩溃

C++ mutex in lambda results in crash

本文关键字:崩溃 lambda C++      更新时间:2023-10-16

我想从 lambda 中的互斥锁获取锁,但这会导致崩溃。

class ControlWindow
{
public:
    explicit ControlWindow();
    ~ControlWindow();
private:
    void createMyWindow();
    std::mutex m_mutex;
};
void ControlWindow::createMyWindow()
{
    ...
    Button* btn = new Button([this](void*) {
            m_mutex.lock(); // this fails with the error below
            {...}
            m_mutex.unlock();
    });
    ...
}
引发

的错误是:在 0x00007FFF05FD3FB8 中引发异常 MyApp.exe:内存Microsoft C++异常:标准::system_error 位置0x000000AD753FE070。调试错误!

如果互斥锁是 cpp 文件中的全局变量,则互斥锁也不起作用。其他成员变量可以很好地访问,在调试器中,互斥体在 lambda 中和在 lambda 外部看起来相同。

如何正确访问互斥锁?

我的错误是我尝试从同一线程锁定互斥锁两次。传递到 lambda 工作正常。此外,使用std::lock_guard<>也是适当的。事实上,需要调用代码来发现我的错误。