我正在使用SDL2开始一个项目来显示Dining philosophers problem的结果。我使用pthread_create
为我的“哲学家”创建了7个主题但是我注意到使用ps -M
总共需要5个主题。
示例(我的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。
答案 0 :(得分:1)
快速浏览一下最新的SDL2来源,快速了解'SDL_CreateThread'揭示
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
其中,您可能对cocoa特定和一般调用感兴趣。我们看到可可案缩小了:
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'。