diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a5eb043 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.16) + +project(sdl-thread LANGUAGES C) + +find_package(SDL2 REQUIRED) +add_executable(sdl-thread main.c) + +include(GNUInstallDirs) +install(TARGETS sdl-thread + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2) diff --git a/main.c b/main.c new file mode 100644 index 0000000..745e204 --- /dev/null +++ b/main.c @@ -0,0 +1,54 @@ +#include +#include + + +SDL_mutex *s_lock = NULL; +SDL_cond *s_cond = NULL; + +int work_thread(void *arg) { + SDL_LockMutex(s_lock); + printf("<=========work_thread sleep=========>\n"); + sleep(10); + printf("<=========work_thread wait condition=========>\n"); + SDL_CondWait(s_cond, s_lock); + printf("<=========work_thread receive signal=========>\n"); + printf("<=========work_thread end=========>\n"); + SDL_UnlockMutex(s_lock); + + return 0; +} + +#undef main +int main() +{ + s_lock = SDL_CreateMutex(); + s_cond = SDL_CreateCond(); + SDL_Thread *t = SDL_CreateThread(work_thread, "work_thread", NULL); + + if (!t) { + printf("SDL_CreateThread() failed\n"); + return -1; + } + + for (int i = 0; i < 2; i++) { + sleep(2); + printf("main execute\n"); + } + + printf("SDL_LockMutex(s_lock) before\n"); + SDL_LockMutex(s_lock); + printf("SDL_LockMutex(s_lock) after\n"); + printf("SDL_CondSignal(s_cond) before\n"); + SDL_CondSignal(s_cond); + printf("SDL_CondSignal(s_cond) after\n"); + sleep(10); + printf("SDL_UnlockMutex(s_lock) before\n"); + SDL_UnlockMutex(s_lock); + printf("SDL_UnlockMutex(s_lock) after\n"); + + SDL_WaitThread(t, NULL); + SDL_DestroyMutex(s_lock); + SDL_DestroyCond(s_cond); + + return 0; +}