我一直在使用一个简单的双线程应用程序,同时运行两个线程。每个线程将图形(三角形/矩形)绘制到屏幕的预定义且互斥的部分。也就是说,两个线程都不会在彼此的屏幕空间中写入。
运行程序很长时间后,比如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操作编写显式用户定义的互斥锁,我正在做什么?或者是我缺少的其他东西?我该如何解决这个问题?
我正在使用:
Raspberry Pi中提供了libSDL1.2
libpthreads来
libSDL_ttf
编辑:线程2互斥的gdb跟踪:
(gdb)p *(pthread_mutex_t *)0xb542ed38 $ 3 = {_ data = { _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} < / p>
如果您需要更多信息,请与我们联系。
答案 0 :(得分:1)
此方法仅适用于软件表面(无硬件加速)。对于硬件表面,它最多会锁定和等待 - 无论如何都没有性能优势;在坏的情况下(通过快速查看SDL源来判断)它可能会以简单的逻辑结束SDL_LockSurface的工作方式。
我甚至不确定你的外部互斥体是否有用,因为硬件加速图形访问应该几乎总是被锁定到一个线程(OpenGL就是一个很好的例子 - 每个线程都有自己独立的绘图上下文)。
简而言之,我认为你没有理由使用两个线程进行绘制,但无论如何都不能保证它是线程安全的。