SDL中的互斥量和条件变量

一、概述

在最简单的音视频播放器中,由于解复用和解码是在不同的线程中,存放包的队列是公共资源,需要互斥。解复用向队列添加包,解码从队列取包,也需要同步。所以队列的入队和出队操作,采用了互斥量和条件变量。

二、主要内容

互斥量

  1. 创建互斥量
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");
}
  1. 销毁锁
SDL_DestroyMutex(mutex);

条件变量

  1. 创建条件变量
SDL_cond* SDL_CreateCond(void)
  1. 等待条件变量
int SDL_CondWait(SDL_cond*  cond,
                 SDL_mutex* mutex)

信号激活后,返回0,否则返回错误代码。

SDL_ConWait必须在互斥量锁住之后才能调用。该函数会解锁锁住的互斥量,并等待拥有该锁的线程激活信号。激活后,会重新上锁。

  1. 激活信号
    成功返回 0,否则返回错误代码。
    SDL_ConSignal会激活等待的一个线程(根据优先级),而不是所有等待的线程。

  2. 销毁条件变量

void SDL_DestroyCond(SDL_cond* cond)

三、一个简单的例子

生产者向队列不断的放入产品,消费者不停的从队列取出产品进行消费。这里不考虑队列满的情况,假设队列容量是无限大。当没有产品时,消费者等待。

猜你喜欢

转载自blog.csdn.net/chanlp129/article/details/127580760