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