流媒体开发14SDL线程
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流媒体开发14SDL线程相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于流媒体开发14SDL线程的主要内容,如果未能解决你的问题,请参考以下文章