lambda 中的 C++ 互斥导致崩溃
C++ mutex in lambda results in crash
我想从 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();
});
...
}
The error thrown is: Exception thrown at 0x00007FFF05FD3FB8 in
MyApp.exe: Microsoft C++ exception: std::system_error at memory
location 0x000000AD753FE070. Debug Error!
如果 mutex 是 cpp 文件中的全局变量,它也不起作用。可以很好地访问其他成员变量,并且在调试器中,互斥量在 lambda 中和在 lambda 之外看起来是一样的。
如何正确访问互斥量?
我的错误是我试图从同一个线程锁定互斥体两次。传递到 lambda 工作正常。使用 std::lock_guard<>
也是合适的。实际上,需要调用代码来发现我的错误。
我想从 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();
});
...
}
The error thrown is: Exception thrown at 0x00007FFF05FD3FB8 in MyApp.exe: Microsoft C++ exception: std::system_error at memory location 0x000000AD753FE070. Debug Error!
如果 mutex 是 cpp 文件中的全局变量,它也不起作用。可以很好地访问其他成员变量,并且在调试器中,互斥量在 lambda 中和在 lambda 之外看起来是一样的。
如何正确访问互斥量?
我的错误是我试图从同一个线程锁定互斥体两次。传递到 lambda 工作正常。使用 std::lock_guard<>
也是合适的。实际上,需要调用代码来发现我的错误。