SDL2是否自动创建线程?

时间:2014-06-12 17:41:35

标签: c multithreading sdl-2

我正在使用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。

1 个答案:

答案 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'。