当前位置: 首页 > news >正文

多线程导致 EGL_BAD_ACCESS 错误的原理与解决方案

在编译成功后RB-SLAM2时,运行建图后,程序意外在结束时出现段错误。即在多线程环境下使用 OpenGL 时,遇到

New map created with 1053 points
Received 'EGL_BAD_ACCESS' trying to set current EGL context.
When calling 'MakeCurrent()' from a different thread, you need to unset the previous context first by calling 'RemoveCurrent()'.

Received 'EGL_BAD_ACCESS' trying to set current EGL context. 错误,通常是由于多个线程同时操作 EGL 上下文(EGLContext)导致的。本文将分析错误的原理,并提供解决方案。

错误原理

1. EGL 上下文 (EGLContext) 是线程绑定的

在 EGL(Embedded-System Graphics Library)中,每个 EGLContext 只能在 单个线程 内被绑定并使用。如果一个线程已经持有 EGL 上下文,而另一个线程尝试使用同一上下文,就会触发 EGL_BAD_ACCESS 错误。

2. 多线程同时访问同一个 OpenGL 上下文

当多个线程尝试 同时调用 OpenGL API 并操作相同的 EGL 上下文,而没有适当的同步机制时,就会出现 EGL_BAD_ACCESS

3. 线程未正确解除上下文

错误提示 When calling 'MakeCurrent()' from a different thread, you need to unset the previous context first by calling 'RemoveCurrent()'. 说明问题的关键:

  • 如果一个线程已经绑定了 EGLContext,另一个线程要使用它,必须先调用 eglMakeCurrent(NULL, NULL, NULL)解除 之前的绑定。

  • 否则,EGL 仍然认为上下文归属于原来的线程,导致 EGL_BAD_ACCESS

4. 竞争条件与段错误(核心已转储)

如果多个线程同时访问 OpenGL 资源(如 EGLSurfaceEGLContext),并且没有适当的互斥锁或同步机制,就可能导致竞争条件,最终触发 段错误 (core dumped)

解决方案
 

临时生效解决方案:

export __GL_SINGLETHREADED=1

或者添加到环境变量,长时间生效。

线程同步

如果必须在多个线程中共享 OpenGL 资源,建议使用 互斥锁 (std::mutex) 来确保同一时间只有一个线程访问 OpenGL。

std::mutex gl_mutex;
gl_mutex.lock();
// OpenGL 渲染操作
gl_mutex.unlock();

 成功运行并正常退出:

总结

多线程操作 OpenGL 时,必须确保:

  1. 每个线程使用 独立的 EGL 上下文,避免多个线程同时操作同一个上下文。

  2. 线程切换前,使用 eglMakeCurrent(NULL, NULL, NULL) 解绑 EGLContext

  3. 通过 export __GL_SINGLETHREADED=1 禁用多线程 OpenGL,避免竞态条件。

  4. 必要时使用 互斥锁 保证线程安全。

如果你的应用需要高性能渲染,建议使用 OpenGL 的多线程渲染队列,而不是多个线程直接访问 EGL 上下文。

这样可以避免 EGL_BAD_ACCESS 和段错误,提升 OpenGL 在多线程环境下的稳定性。

相关文章:

  • 蓝桥杯--bfs专题第二个题目(leetcode103二叉树)
  • 使用事件监听器来处理并发环境中RabbitMQ的同步响应问题
  • Java设计模式--单例模式
  • 计算机四级 - 数据库原理(操作系统部分)- 第8章「死锁」
  • pdfh5 pdf
  • RWA代币化崛起中的香港机遇:数字金融新枢纽的破局之道
  • GitLab 中文版17.10正式发布,27项重点功能解读【二】
  • GeoChat : Grounded Large Vision-Language Model for Remote Sensing论文精读
  • 解决 Not allowed to load local resource 问题
  • 简单选择排序
  • 手绘的思维导图怎么转成电子版思维导图?分享今年刚测试出来的方法
  • 设备预测性维护:工业设备的 “天气预报”,你家机器需要吗?
  • 【10万QPS压力测试】Redis三主三从高可用集群基准测试
  • Linux CentOS7 安装emqx详细教程
  • 信源的分类及数学模型
  • Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战
  • 【多线程】线程安全问题
  • 【服务器环境安装指南-指定 cuda 版本】在 Ubuntu 22.04 上完成 cuda-toolkit 12.0 和 cudnn 12.x 的安装教程
  • 智慧路灯的发展史
  • springboot中logback日志配置
  • 深圳做网站建设的公司/搜索引擎优化工具有哪些
  • 国内logo设计网站/网络广告营销有哪些
  • dw网站引导页怎么做/搜索引擎优化方法总结
  • 带注册登录的网站模板/免费优化
  • 旅行社网站建设方案/有创意的营销案例
  • 嘉兴免费做网站/第三方网络营销平台有哪些