宿松网站建设设计桂林广告公司网站建设

张小明 2026/1/13 13:04:32
宿松网站建设设计,桂林广告公司网站建设,深圳网站建设三把火科技,wordpress用户枚举Android 的 MessageQueue 很复杂#xff08;native poll/epoll、barrier、idle handler…#xff09; 但它的核心思想非常简单#xff1a; ✅ 一个队列存消息 ✅ 一个循环不断取消息执行 ✅ 线程安全#xff08;加锁/条件变量#xff09;我们用 C 写一个可跑的简化版…Android 的 MessageQueue 很复杂native poll/epoll、barrier、idle handler…但它的核心思想非常简单✅ 一个队列存消息✅ 一个循环不断取消息执行✅ 线程安全加锁/条件变量我们用 C 写一个可跑的简化版支持post(msg)支持loop()阻塞取消息支持quit()退出1数据结构消息节点 队列typedef struct Message { int what; void (*callback)(int what); // 收到消息后执行的回调 struct Message* next; } Message; typedef struct { Message* head; Message* tail; int quit; pthread_mutex_t mutex; pthread_cond_t cond; } MessageQueue;2队列初始化 / 销毁void mq_init(MessageQueue* q){ q-head q-tail NULL; q-quit 0; pthread_mutex_init(q-mutex, NULL); pthread_cond_init(q-cond, NULL); } void mq_destroy(MessageQueue* q){ pthread_mutex_lock(q-mutex); Message* cur q-head; while(cur){ Message* next cur-next; free(cur); cur next; } q-head q-tail NULL; pthread_mutex_unlock(q-mutex); pthread_mutex_destroy(q-mutex); pthread_cond_destroy(q-cond); }3post入队 唤醒 loopvoid mq_post(MessageQueue* q, int what, void (*cb)(int)){ Message* m (Message*)malloc(sizeof(Message)); m-what what; m-callback cb; m-next NULL; pthread_mutex_lock(q-mutex); if(q-tail NULL){ q-head q-tail m; }else{ q-tail-next m; q-tail m; } pthread_cond_signal(q-cond); // 通知消费者 pthread_mutex_unlock(q-mutex); }4next阻塞取消息队列空就等Message* mq_next(MessageQueue* q){ pthread_mutex_lock(q-mutex); while(!q-quit q-head NULL){ pthread_cond_wait(q-cond, q-mutex); } if(q-quit){ pthread_mutex_unlock(q-mutex); return NULL; } Message* m q-head; q-head m-next; if(q-head NULL) q-tail NULL; pthread_mutex_unlock(q-mutex); return m; }5loop像 Looper 一样执行消息void mq_loop(MessageQueue* q){ while(1){ Message* m mq_next(q); if(m NULL) break; if(m-callback){ m-callback(m-what); } free(m); } }6quit让 loop 退出void mq_quit(MessageQueue* q){ pthread_mutex_lock(q-mutex); q-quit 1; pthread_cond_broadcast(q-cond); pthread_mutex_unlock(q-mutex); }7完整可运行 DemoLinux / macOS编译gcc mq.c -o mq -lpthread#include stdio.h #include stdlib.h #include pthread.h #include unistd.h typedef struct Message { int what; void (*callback)(int what); struct Message* next; } Message; typedef struct { Message* head; Message* tail; int quit; pthread_mutex_t mutex; pthread_cond_t cond; } MessageQueue; void mq_init(MessageQueue* q){ q-head q-tail NULL; q-quit 0; pthread_mutex_init(q-mutex, NULL); pthread_cond_init(q-cond, NULL); } void mq_post(MessageQueue* q, int what, void (*cb)(int)){ Message* m (Message*)malloc(sizeof(Message)); m-what what; m-callback cb; m-next NULL; pthread_mutex_lock(q-mutex); if(q-tail NULL){ q-head q-tail m; }else{ q-tail-next m; q-tail m; } pthread_cond_signal(q-cond); pthread_mutex_unlock(q-mutex); } Message* mq_next(MessageQueue* q){ pthread_mutex_lock(q-mutex); while(!q-quit q-head NULL){ pthread_cond_wait(q-cond, q-mutex); } if(q-quit){ pthread_mutex_unlock(q-mutex); return NULL; } Message* m q-head; q-head m-next; if(q-head NULL) q-tail NULL; pthread_mutex_unlock(q-mutex); return m; } void mq_quit(MessageQueue* q){ pthread_mutex_lock(q-mutex); q-quit 1; pthread_cond_broadcast(q-cond); pthread_mutex_unlock(q-mutex); } void mq_loop(MessageQueue* q){ while(1){ Message* m mq_next(q); if(m NULL) break; if(m-callback) m-callback(m-what); free(m); } } void mq_destroy(MessageQueue* q){ pthread_mutex_lock(q-mutex); Message* cur q-head; while(cur){ Message* next cur-next; free(cur); cur next; } q-head q-tail NULL; pthread_mutex_unlock(q-mutex); pthread_mutex_destroy(q-mutex); pthread_cond_destroy(q-cond); } void on_msg(int what){ printf(handle msg what%d (thread%lu)\n, what, (unsigned long)pthread_self()); } typedef struct { MessageQueue* q; } ProducerArg; void* producer(void* arg){ ProducerArg* pa (ProducerArg*)arg; for(int i1;i5;i){ mq_post(pa-q, i, on_msg); usleep(200 * 1000); } mq_quit(pa-q); return NULL; } int main(){ MessageQueue q; mq_init(q); pthread_t t; ProducerArg pa { .q q }; pthread_create(t, NULL, producer, pa); mq_loop(q); pthread_join(t, NULL); mq_destroy(q); return 0; }8这跟 Android MessageQueue 的对应关系mq_post≈enqueueMessagemq_next≈next()mq_loop≈Looper.loop()cond_wait≈ “没有消息就阻塞等待”quit≈Looper.quit()
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

上海网站设计 企业广州站

XOutput终极指南:如何将DirectInput游戏手柄快速转换为XInput设备 【免费下载链接】XOutput A small DirectInput to Xinput wrapper 项目地址: https://gitcode.com/gh_mirrors/xou/XOutput 在现代PC游戏世界中,兼容性往往是玩家面临的最大挑战之…

张小明 2026/1/9 17:12:07 网站建设

鄂伦春网站建设潍坊网站建设壹品网络

深度学习研究员月薪8万-11万、AGI实习生日薪500元-1000元、AIGC领域百万年薪岗位频现…… 2025年春季招聘大幕拉开,人工智能(AI)无疑是全场最耀眼的“顶流”,从科技巨头到创新企业纷纷加码抢人,让AI人才彻底成为就业市…

张小明 2026/1/9 17:12:09 网站建设

保山市建设厅官方网站网站托管网站建设竞价托管

国内纸纱线FSC春夏14至16针,实力公司推荐排行榜揭秘引言在时尚与环保并行的当下,纸纱线FSC春夏14至16针产品凭借其独特的质感和环保属性,在纺织市场中崭露头角。这种纱线不仅满足了消费者对春夏衣物轻薄透气的需求,还响应了全球可…

张小明 2026/1/9 17:12:06 网站建设

江西南昌网站建设招标企业网站邮箱建设

第一章:Markdown与JavaDoc融合的革命性意义 现代软件开发中,代码文档的质量直接影响项目的可维护性与团队协作效率。传统的 JavaDoc 仅支持简单的 HTML 标签和纯文本描述,难以表达复杂的结构化内容。而 Markdown 以其简洁语法和强大表达能力&…

张小明 2026/1/9 17:12:08 网站建设

连接外国的网站吗wordpress 获取tag名

一、二叉排序树的插入特性 插入位置:新结点总是作为叶子结点插入。从根结点开始,比较关键字大小,若小于当前结点则进入左子树,否则进入右子树,直到找到空指针位置进行插入。此过程不涉及已有结点的移动,仅修…

张小明 2026/1/13 10:55:06 网站建设

视频嵌入网站pinterest app下载

移动端适配前景:Sonic模型压缩与加速可行性探讨 在短视频内容井喷、虚拟主播频繁出镜的今天,如何以更低的成本、更快的速度生成高质量的数字人视频,已成为内容创作者和企业开发者共同关注的核心问题。传统数字人系统依赖复杂的3D建模、动作捕…

张小明 2026/1/9 17:12:10 网站建设