SDL线程创建

sdl线程的创建:这里描述这个的主要原因是因为ffplay是这样实现的,一个线程送解码,一个线程获取解码之后的数据,因为是多线程并且有队列等的管理,所以也使用了锁和信号量

基本介绍

线程:

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

补充:

锁: 一个线程拿到锁,另一个线程必须等锁释放才能获取到锁并将线程继续往下执行 

信号量: 当SDL_CondWait等待信号量的时候,线程会将锁释放掉,

执行结果

这个demo主要是让我了解一下几点:

1、线程是怎么创建的

2、线程之间锁是怎么使用的

3、线程之间信号量是怎么使用的,信号量和锁之间的关系.

代码实现 

#include <SDL.h>
#include <stdio.h>

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后,这个函数退出

    printf("                <===========thread_work receive signal, continue to do ~_~!!!\n");
    printf("                <===========thread_work 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(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");
    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;
}

原文链接:SDL线程创建 - 资料 - 我爱音视频网 - 构建全国最权威的音视频技术交流分享论坛 

本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部↓↓ 

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/125787302
SDL