一、概述
在最简单的音视频播放器中,由于解复用和解码是在不同的线程中,存放包的队列是公共资源,需要互斥。解复用向队列添加包,解码从队列取包,也需要同步。所以队列的入队和出队操作,采用了互斥量和条件变量。
二、主要内容
互斥量
- 创建互斥量
SDL_mutex *mutex;
mutex = SDL_CreateMutex();
创建的互斥量默认是未上锁的。
2. 上锁和解锁
if (SDL_LockMutex(mutex) == 0) {
/* Do stuff while mutex is locked */
SDL_UnlockMutex(mutex);
}
else {
fprintf(stderr, "Couldn't lock mutex\n");
}
- 销毁锁
SDL_DestroyMutex(mutex);
条件变量
- 创建条件变量
SDL_cond* SDL_CreateCond(void)
- 等待条件变量
int SDL_CondWait(SDL_cond* cond,
SDL_mutex* mutex)
信号激活后,返回0,否则返回错误代码。
SDL_ConWait必须在互斥量锁住之后才能调用。该函数会解锁锁住的互斥量,并等待拥有该锁的线程激活信号。激活后,会重新上锁。
-
激活信号
成功返回 0,否则返回错误代码。
SDL_ConSignal会激活等待的一个线程(根据优先级),而不是所有等待的线程。 -
销毁条件变量
void SDL_DestroyCond(SDL_cond* cond)
三、一个简单的例子
生产者向队列不断的放入产品,消费者不停的从队列取出产品进行消费。这里不考虑队列满的情况,假设队列容量是无限大。当没有产品时,消费者等待。