我正在使用SDL2启动一个项目,以显示“餐饮哲学家”问题的结果。我使用时为“哲学家”创建了7个线程,pthread_create
但我发现总是比使用时多5个线程ps -M
。
示例(使用我自愿创建的7个线程[已通过一些文本输出确认]):
achedeuzot 56774 s000 0.9 U 46T 0:00.04 0:00.06 ./philo
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 48T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
56774 0.0 S 46T 0:00.00 0:00.00
当我禁用生成线程但继续显示窗口的代码时,仍然还有5个线程:
achedeuzot 57751 s000 0.9 U 46T 0:00.04 0:00.06 ./philo
57751 0.0 S 46T 0:00.00 0:00.00
57751 0.0 S 48T 0:00.00 0:00.00
57751 0.0 S 0T 0:00.00 0:00.00
57751 0.0 S 46T 0:00.00 0:00.00
57751 0.0 S 46T 0:00.00 0:00.00
因此,似乎SDL2自己创建了5个线程。我使用SDL_RENDERER_ACCELERATED
了SDL_CreateRenderer()
。
我搜索了其他提及此内容的人,但找不到任何相关信息(或者我的关键字不正确)。
这5个额外的线程从哪里来?这是我的计算机专用的吗?是来自GPU加速吗?是ps
命令发出的吗?是SDL2还是SDL2的某些子例程?
感谢您帮助我更清楚地了解这里发生了什么!
其他信息:我没有使用SDL_CreateThread()
。我使用的是Mac OS 10.9.3。
快速浏览一下最新的SDL2来源,可以看到“ SDL_CreateThread”的快速grep
src/video/cocoa/SDL_cocoamousetap.m
src/video/winrt/SDL_winrtevents.cpp
src/video/psp/SDL_pspevents.c
src/timer/SDL_timer.c
src/main/haiku/SDL_BeApp.cc
src/haptic/windows/SDL_syshaptic.c
src/dynapi/SDL_dynapi.c
src/dynapi/SDL_dynapi_overrides.h
src/dynapi/SDL_dynapi_procs.h
src/thread/SDL_thread.c
src/joystick/winrt/SDL_xinputjoystick.c
src/joystick/windows/SDL_dxjoystick.c
src/joystick/psp/SDL_sysjoystick.c
src/audio/SDL_audio.c
其中,您可能对可可特定调用和常规调用感兴趣。缩小可可案例,我们看到:
void
Cocoa_InitMouseEventTap(SDL_MouseData* driverdata)
{
SDL_MouseEventTapData *tapdata;
driverdata->tapdata = SDL_calloc(1, sizeof(SDL_MouseEventTapData));
tapdata = (SDL_MouseEventTapData*)driverdata->tapdata;
tapdata->runloopStartedSemaphore = SDL_CreateSemaphore(0);
if (tapdata->runloopStartedSemaphore) {
tapdata->thread = SDL_CreateThread(&Cocoa_MouseTapThread, "Event Tap Loop", tapdata);
if (!tapdata->thread) {
SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
}
}
if (!tapdata->thread) {
SDL_free(driverdata->tapdata);
driverdata->tapdata = NULL;
}
}
因此,至少有一个线程用于那里的鼠标事件。也许还有一两个线程用于定时器和音频。
如果您真的想知道这些线程在做什么,那么到目前为止,最简单的方法是将其附加到'gdb -p'并运行'thread apply all backtrace'。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句