gpt4 book ai didi

c - SDL2 是否自动创建线程?

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:17 26 4
gpt4 key购买 nike

我正在使用 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_CreateRenderer() 使用 SDL_RENDERER_ACCELERATED

我已经搜索过其他人提到这个但找不到任何相关信息(或者我的关键字不正确)。

这 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

其中,您可能对 cocoa 特定和一般调用感兴趣。缩小我们看到的 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”。

关于c - SDL2 是否自动创建线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com