【问题标题】:Multithreaded SDL error in C++C++ 中的多线程 SDL 错误
【发布时间】:2010-05-12 08:51:28
【问题描述】:

我正在使用 SDL 用 C++ 构建程序,但偶尔会收到此错误:

* 检测到 glibc * ./assistant: double free or corruption (!prev)

很难复制,所以我找不到确切的原因,但我只是在程序中添加了第二个线程,似乎没有一个线程自行运行导致错误。

线程不共享任何变量,尽管它们都运行函数SDL_BlitSurfaceSDL_Flip。同时运行这些会引发这样的错误,还是我在找错树?

如果这是原因,我是否应该在所有 SDL 调用周围简单地抛出一个互斥锁?

【问题讨论】:

  • 这两个函数都采用SDL_Surface * 参数。您是否将相同的表面传递给每个函数?
  • 其实,你是对的,我知道。事实上,所有相同的表面:两个线程都调用一个通用的绘图函数。这会导致我提到的错误吗?我不熟悉它,但在浏览答案时似乎暗示当尝试取消分配已经未分配的内存时引发错误。

标签: c++ multithreading sdl


【解决方案1】:

您是否使用 MALLOC_CHECK_ 环境变量集运行?这会打开 glibc 中的内存检查,我之前遇到过问题,因为 glibc 内存检查代码 (http://sourceware.org/bugzilla/show_bug.cgi?id=10282) 中的竞争条件使它虚假地发出这样的消息。尝试在 valgrind 下运行,看看是否有任何问题。

【讨论】:

    【解决方案2】:

    原来这是由线程未正确终止引起的。当他们看到 main 已经完成运行(通过全局“运行”变量)时,我允许他们返回,而不是从 main 中终止它们,并且问题消失了。

    【讨论】:

    • 解决方案很可能不是这个,而是您如何终止已删除代码中的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多