04-SDL线程

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 执行结束解锁 --后--

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值