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;}
阅读全文
0 0
- SDL_CondSignal与SDL_CondWait用法
- SDL_CondWait及SDL_CondSignal
- SDL_CondWait
- Transact_SQL与contains用法
- JCreator 配置与用法
- innerHTML与innerText用法
- sizeof()与strlen()用法
- #define与typedef用法
- typedef用法 与#define
- #define与typedef用法
- LPAD 与 RPAD 用法
- setjmp与logjmp用法
- strstr与strchar用法
- rand()与srand()用法
- chown与chmod用法
- synchronized用法与介绍
- sprintf与sscanf用法
- #define与typedef用法
- jsp中out.print及out.println无法换行的问题
- Elasticsearch生成json,创建索引(把数据写入索引中)
- 转载一个大神的函数
- [数据结构课设]汽车租借公司的管理
- 图像的旋转操作
- SDL_CondSignal与SDL_CondWait用法
- Kafka系列二之部署与使用
- nginx 负载均衡5种配置方式
- Tomcat-高并发并设置
- 反引号
- teamviewer 安装成功
- 对CNN感受野一些理解
- fastjson简单运用
- Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总