SDL_CondSignal与SDL_CondWait用法

来源:互联网 发布:微信网页授权登录源码 编辑:程序博客网 时间:2024/06/10 09:15

1. 函数说明

      SDL_CondSignal: Use this function to restart one of the threads that are waiting on the condition variable.

      使用该函数来重启等待此信号的线程。

      SDL_CondWait: Use this function to wait until a condition variable is signaled.

      直到有该信号发送,调用此函数。


2. 例子说明

SDL_bool condition = SDL_FALSE;SDL_mutex *lock;SDL_cond *cond;lock = SDL_CreateMutex();cond = SDL_CreateCond();..Thread A:    SDL_LockMutex(lock);    while (!condition) {        SDL_CondWait(cond, lock);    }    SDL_UnlockMutex(lock);Thread B:    SDL_LockMutex(lock);    ...    condition = SDL_TRUE;    ...    SDL_CondSignal(cond);    SDL_UnlockMutex(lock);..SDL_DestroyCond(cond);SDL_DestroyMutex(lock);


线程A循环等待信号cond,对lock解锁,收到信号cond后,对lock上锁,进行操作。这里condition变为SDL_TRUE,所以只循环一次,若需多次调用,可以设为多次循环,或死循环,通过变量加break进行判断。

线程B进行操作后,发送cond信号,触发线程A的操作。


3. PS说明

    dranger的视频播放tutorial中packet队列的存放与提取采用了相同方式。

int packet_queue_put(PacketQueue *q, AVPacket *pkt) {  AVPacketList *pkt1;  if(pkt != &flush_pkt && av_dup_packet(pkt) < 0) {    return -1;  }  pkt1 = av_malloc(sizeof(AVPacketList));  if (!pkt1)    return -1;  pkt1->pkt = *pkt;  pkt1->next = NULL;    SDL_LockMutex(q->mutex);  if (!q->last_pkt)    q->first_pkt = pkt1;  else    q->last_pkt->next = pkt1;  q->last_pkt = pkt1;  q->nb_packets++;  q->size += pkt1->pkt.size;  SDL_CondSignal(q->cond);    SDL_UnlockMutex(q->mutex);  return 0;}static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block){  AVPacketList *pkt1;  int ret;  SDL_LockMutex(q->mutex);    for(;;) {        if(global_video_state->quit) {      ret = -1;      break;    }    pkt1 = q->first_pkt;    if (pkt1) {      q->first_pkt = pkt1->next;      if (!q->first_pkt)q->last_pkt = NULL;      q->nb_packets--;      q->size -= pkt1->pkt.size;      *pkt = pkt1->pkt;      av_free(pkt1);      ret = 1;      break;    } else if (!block) {      ret = 0;      break;    } else {      SDL_CondWait(q->cond, q->mutex);    }  }  SDL_UnlockMutex(q->mutex);  return ret;}



原创粉丝点击