C++ lambda 中的互斥锁会导致崩溃
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();
});
...
}
引发的错误是:在 0x00007FFF05FD3FB8 中引发异常 MyApp.exe:内存Microsoft C++异常:标准::system_error 位置0x000000AD753FE070。调试错误!
如果互斥锁是 cpp 文件中的全局变量,则互斥锁也不起作用。其他成员变量可以很好地访问,在调试器中,互斥体在 lambda 中和在 lambda 外部看起来相同。
如何正确访问互斥锁?
我的错误是我尝试从同一线程锁定互斥锁两次。传递到 lambda 工作正常。此外,使用std::lock_guard<>
也是适当的。事实上,需要调用代码来发现我的错误。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- Clang 8的Lambda表达中的双重崩溃
- 调用 lambda 的结构/类成员时程序崩溃并"bad_function_call"
- C++ lambda 中的互斥锁会导致崩溃
- 调用从 lambda 作为模板参数传递的成员函数指针会崩溃
- 崩溃当std ::函数是从lambda返回的VS 2012中返回的值时的崩溃
- 使用Armadillo类型的lambda函数崩溃的未知原因
- 为什么我的C++程序在将 lambda 转换为函数指针时崩溃