SDL-2线程逻辑

SDL 线程

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

#include <stdio.h>
#include<stdlib.h>
#include <unistd.h> // for close

#include"SDL2/SDL.h"
#define FF_QUIT_EVENT    (SDL_USEREVENT + 2) // 用户自定义事件

SDL_mutex *s_lock = NULL;
SDL_cond *s_cond = NULL;
int thread_work(void *arg){
    SDL_LockMutex(s_lock);
    printf("                <============thread_work sleep\n");
    sleep(10);
    printf("                <============thread_work wait\n");
    // 释放s_lock资源,并等待signal。之所以释放s_lock是让别的线程能够获取到s_lock
    SDL_CondWait(s_cond, s_lock); //另一个线程(1)发送signal和(2)释放lock后,这个函数退出


}


int main()
{
      s_lock = SDL_CreateMutex();
      s_cond = SDL_CreateCond();
      SDL_Thread *t = SDL_CreateThread(thread_work,"thread_work",NULL);
      if(!t)
      {
          printf("  %s",SDL_GetError);
          return -1;
      }

      for(int i = 0;i< 2;i++)
      {
          sleep(2);
          printf("main execute =====>\n");
      }
      printf("main SDL_LockMutex(s_lock) before ====================>\n");
      SDL_LockMutex(s_lock);  // 获取锁,但是子线程还拿着锁
      printf("main ready send signal====================>\n");
      printf("main SDL_CondSignal(s_cond) before ====================>\n");
      printf("main SDL_LockMutex(s_lock) before ====================>\n");
      SDL_LockMutex(s_lock);  // 获取锁,但是子线程还拿着锁
      printf("main ready send signal====================>\n");
      printf("main SDL_CondSignal(s_cond) before ====================>\n");
      SDL_CondSignal(s_cond); // 发送信号,唤醒等待的线程
      printf("main SDL_CondSignal(s_cond) after ====================>\n");
      sleep(10);
      SDL_UnlockMutex(s_lock);// 释放锁,让其他线程可以拿到锁
      printf("main SDL_UnlockMutex(s_lock) after ====================>\n");

      SDL_WaitThread(t, NULL);
      SDL_DestroyMutex(s_lock);
      SDL_DestroyCond(s_cond);

      return 0;
  }

输出结果
在这里插入图片描述

结果分析
首先main 函数中创建一个子线程t 并且进入对应函数 “thread_work”

子线程获取到锁 SDL_LockMutex(s_lock);
在这里插入图片描述
然后睡眠10秒

在这里插入图片描述
主线程线程运行4秒以后 获取锁 但是锁一直被占用

在这里插入图片描述
等待信号后唤醒 需要必须同时得到两个条件 1 得到锁 2 得到信号量
如图
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值