SDL2是否自动创建线程?

阿切德祖特

我正在使用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_ACCELERATEDSDL_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SDL2从OSX上的不同线程创建纹理

来自分类Dev

SDL2:SDL_GetMouseState()线程安全吗?

来自分类Dev

强制停止自动旋转(Android,C ++,SDL2)

来自分类Dev

从SDL2表面创建OpenGL纹理-奇怪的像素值

来自分类Dev

在GHCI中创建一个SDL2窗口

来自分类Dev

如何在MacOS上使用SDL2创建窗口

来自分类Dev

Visual Studio和SDL2窗口创建失败

来自分类Dev

我是否正在删除sdl2和opengl?

来自分类Dev

无法使用SDL_PIXELFORMAT_NV12像素格式创建SDL2纹理

来自分类Dev

在 Raspberry Pi 2 上使用多线程进行 SDL2 渲染

来自分类Dev

SDL2抗锯齿

来自分类Dev

SDL2抗锯齿

来自分类Dev

SDL2 jbutton枚举?

来自分类Dev

SDL2 窗口是透明的

来自分类Dev

C ++ 11 + SDL2 + Windows:任何输入事件后多线程程序均挂起

来自分类Dev

SDL2不同线程中的两个窗口

来自分类Dev

SDL2不同线程中的两个窗口

来自分类Dev

C ++ 11 + SDL2 + Windows:任何输入事件后多线程程序都挂起

来自分类Dev

SDL2、FnMut和mpsc,sender不能在线程间安全共享

来自分类Dev

使用C ++和SDL2创建一个带有矩形的窗口

来自分类Dev

SDL2 是否提供与平台无关的方法来防止窗口关闭?

来自分类Dev

在Linux上安装SDL2

来自分类Dev

手机上的SDL2事件

来自分类Dev

CMake无法静态链接SDL2

来自分类Dev

SDL2 /表面/纹理/渲染

来自分类Dev

将SDL2库与CMake链接

来自分类Dev

SDL2 C ++截屏

来自分类Dev

未知像素格式错误SDL2

来自分类Dev

重新着色SDL2纹理