SDL线程创建: SDL_CreateThread
SDL线程等待: SDL_WaitThead
SDL互斥锁: SDL_CreateMutex / SDL_DestroyMutex
SDL锁定互斥: SDL_LockMutex / SDL_UnlockMutex
SDL条件变量(信号量): SDL_CreateCond / SDL_DestoryCond
SDL条件变量(信号量)等待/通知: SDL_CondWait / SDL_CondSingal
代码demo
线程函数
int thread_work(void *arg)
{
SDL_LockMutex(s_lock);
printf("--子-- <========================= thread_work 休眠 --前-- \n"); // 拿到锁,休眠5秒
sleep(10); // 用来测试获取锁
printf("--子-- <========================= thread_work 休眠 --后-- \n"); // 终于休眠10秒,SDL_CondWait 释放锁进入condwait 状态释放锁进去
// 释放 s_lock 并等待signal 之所以释放 s_lock 是让别的线程获得s_lock
SDL_CondWait(s_cond, s_lock); // 另一个线程发送 signal 和 释放 lock 后 这个函数 退出
printf("--子-- <========================= thread_work 收到信号继续执行 \n");
printf("--子-- <========================= thread_work 执行结束解锁 --前-- \n");
SDL_UnlockMutex(s_lock);
printf("--子-- <========================= thread_work 执行结束解锁 --后--\n");
return 0;
}
主线程代码
int sdl_thread()
{
s_lock = SDL_CreateMutex();
s_cond = SDL_CreateCond();
// SDL_Thread *SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data)
SDL_Thread *t = SDL_CreateThread(thread_work, "thread_work", NULL); // SDL线程创建
if (!t)
{
printf("线程创建失败 %s", SDL_GetError());
return -1;
}
for (int i = 0; i < 2; i++)
{ // 主线程总运行2秒后,想获取锁
sleep(1);
printf("--主-- 执行 次数:%d ======>\n", i + 1);
}
printf("--主-- 获得锁 --前-- ===============================>\n");
SDL_LockMutex(s_lock); // 获得锁
printf("--主-- 获得锁 即将发送信号 ===============================>\n");
SDL_CondSignal(s_cond); // 发送信号,唤醒等待线程
printf("--主-- 发送信号 --后-- ===============================>\n");
SDL_UnlockMutex(s_lock); // 释放锁,让其他线程可以
printf("--主-- 解锁 --后-- ===============================>\n");
SDL_WaitThread(t, NULL);
SDL_DestroyMutex(s_lock);
SDL_DestroyCond(s_cond);
}
执行结果
--子-- <========================= thread_work 休眠 --前--
--主-- 执行 次数:1 ======>
--主-- 执行 次数:2 ======>
--主-- 获得锁 --前-- ===============================>
--子-- <========================= thread_work 休眠 --后--
--主-- 获得锁 即将发送信号 ===============================>
--主-- 发送信号 --后-- ===============================>
--主-- 解锁 --后-- ===============================>
--子-- <========================= thread_work 收到信号继续执行
--子-- <========================= thread_work 执行结束解锁 --前--
--子-- <========================= thread_work 执行结束解锁 --后--