c - 树莓派上的 SDL 1.2 出现奇怪的线程死锁

标签 c multithreading sdl

我一直在使用一个简单的双线程应用程序,其中两个线程同时运行。每个线程将一个图形(三角形/矩形)绘制到屏幕的预定义且互斥的部分。也就是说,两个线程永远不会在彼此的屏幕空间中写入。

程序运行很长时间后,比如5个小时左右,主线程继续运行,但另一个线程卡住了(但它没有死掉)。

我在回溯 o/p 中得到了这个,我猜这显示了死锁。

Thread 2 (Thread 0xb542f440 (LWP 2142)):
#0  0xb6e83258 in __lll_lock_wait ()
   from /lib/arm-linux-gnueabihf/libpthread.so.0
#1  0xb6e7de38 in pthread_mutex_lock ()
   from /lib/arm-linux-gnueabihf/libpthread.so.0
#2  0xb6ef8de4 in SDL_mutexP ()
   from /usr/lib/arm-linux-gnueabihf/libSDL-1.2.so.0
#3  0xb6ef4058 in ?? () from /usr/lib/arm-linux-gnueabihf/libSDL-1.2.so.0
#4  0xb6ef4058 in ?? () from /usr/lib/arm-linux-gnueabihf/libSDL-1.2.so.0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

这真的是libSDL1.2的问题吗?我是否必须为我正在执行的每个 SDL_Blit/或其他 SDL 操作编写显式的用户定义互斥体?还是我还缺少其他东西?我该如何解决这个问题?

我正在使用:
libSDL1.2 可在 Raspberry Pi 中使用
libPthreads
libSDL_ttf

编辑:线程 2 互斥体的 gdb 跟踪:

(gdb) p *(pthread_mutex_t*) 0xb542ed38 $3 = {_数据 = {_lock = 39257160,__count = 1048617,__owner = 0, __kind = 7078021、_nusers = 0、_spins = 0、_list = {_next = 0x0}}}、 __size = "H\004W\002)\000\020\000\000\000\000\000\205\000l\000\000\000\000\000\000\000\000", __align = 39257160}

如果您需要更多信息,请告诉我。

最佳答案

此方法仅适用于软件表面(无硬件加速)。对于硬件表面,它最多只能锁定并等待——无论如何,这没有任何性能优势;在糟糕的情况下(通过快速查看 SDL 源代码来判断),根据 SDL_LockSurface 工作原理的简单逻辑,它可能会以糟糕的方式结束。

我什至不确定你的外部互斥体是否会有帮助,因为硬件加速图形访问几乎总是应该锁定到一个线程(OpenGL 就是一个很好的例子 - 每个线程都有自己单独的绘图上下文)。

简而言之,我认为没有理由应该使用两个线程进行绘图,但无论如何都不能保证它是线程安全的。

关于c - 树莓派上的 SDL 1.2 出现奇怪的线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20321828/

相关文章:

c++ - SDL 窗口不显示

c - 你如何在SDL2中设置光标位置?

c - 在 C 编程中使用 Char

c - 二维数组的动态内存分配 (C)

c - 相同条件下的性能测试

c++ - 在另一个线程正在运行的情况下退出应用程序时出错

Java 线程被通知调用卡住了

c# - 在 UI 线程上编码的方法是否需要线程安全

c++ - SDL_VIDEORESIZE 事件中的奇怪高度值

c - 从两个 128 位 block 中收集四个 32 位字