开源C语言库Melon:I/O线程模型

码哥比特课程 2024-04-02 00:09:21
本文展示开源C语言库Melon中的I/O线程模型。在Melon中存在三种线程模型,本篇仅对I/O线程模型进行说明。 关于 Melon 库,这是一个开源的 C 语言库,它具有:开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github: github.com/Water-Melon/Melon 简介首先简单介绍一些什么是I/O线程模型。这一话题将引入图形界面或移动APP开发进行说明。 在常规的涉及网络通信的图形界面客户端程序(如微信、QQ等等)中,客户端既要负责界面展示,也要负责网络数据传输。然而网络传输操作实际上是会存在拥塞和丢包等不稳定因素,因此就存在了阻塞通信与非阻塞通信。在图形界面的程序开发中,很多图形接口的使用与非阻塞I/O很难融合于一个线程内。因此,如果一个线程即负责图形渲染,又负责IO通信,则会出现界面卡顿甚至卡死。 很显然,这样的人机交互界面很不友好,因此就出现了渲染与IO分离,分为了两个线程。即主线程做界面渲染,子线程做IO通讯。这也就是I/O线程这一名词的由来。 Melon支持I/O线程模型不仅仅是为了图形界面开发的需要,也是为了兼顾一些中间件的开发需要。下面我们来一起看一下其使用。 使用我们先给出代码,再进行说明。 #include "mln_iothread.h"#include #include #include static void msg_handler(mln_iothread_t *t, mln_iothread_ep_type_t from, mln_iothread_msg_t *msg){ mln_u32_t type = mln_iothread_msg_type(msg); printf("msg type: %u\n", type);}static void *entry(void *args){ int n; mln_iothread_t *t = (mln_iothread_t *)args; while (1) { n = mln_iothread_recv(t, user_thread); printf("recv %d message(s)\n", n); } return NULL;}int main(void){ int i, rc; mln_iothread_t t; struct mln_iothread_attr tattr; tattr.nthread = 1; tattr.entry = (mln_iothread_entry_t)entry; tattr.args = &t; tattr.handler = (mln_iothread_msg_process_t)msg_handler; if (mln_iothread_init(&t, &tattr) < 0) { fprintf(stderr, "iothread init failed\n"); return -1; } for (i = 0; i < 1000000; ++i) { if ((rc = mln_iothread_send(&t, i, NULL, io_thread, 1)) < 0) { fprintf(stderr, "send failed\n"); return -1; } else if (rc > 0) continue; } sleep(1); mln_iothread_destroy(&t); sleep(3); printf("DONE\n"); return 0;}main中的流程大致如下: 初始化I/O线程对I/O线程发送100万次消息休眠1秒钟销毁I/O线程休眠三秒钟输出完成并退出这里对I/O线程初始化说明一下: struct mln_iothread_attr { mln_u32_t nthread; //拉起几个I/O线程 mln_iothread_entry_t entry; //I/O线程入口函数 void *args; //I/O线程入口参数 mln_iothread_msg_process_t handler; //消息处理函数};消息处理函数handler是当主线程或I/O线程调用mln_iothread_recv接收到消息后被调用,用于让用户自定义对消息的处理。 本例中,I/O线程死循环调用mln_iothread_recv接收从主线程发来的消息,然后在该函数中调用回调msg_handler来处理主线程发来的消息。 同时,可以看到初始化属性结构中包含一个名为nthread的属性,表示I/O线程可以有多个。而Melon中的事件分发模型(mln_event.h)是支持多线程的,因此利用I/O线程模型可以实现:基于同一个事件分发模型,多线程处理事件分发模型上的事件的能力。 除此之外,mln_iothread_send还支持了阻塞发送和非阻塞发送。阻塞发送表示,只有对端线程接收了消息,这个函数才会返回,而非阻塞则是发送后不等待对方接收立即返回。 结语I/O模型现在在Melang脚本语言启动器中被使用,用于使Melang脚本可以启动多个线程来处理脚本程序,有点类似Go中协程在线程间漂移。 欢迎各位对Melon感兴趣的读者访问其Github仓库 github.com/Water-Melon/Melon。 感谢阅读!
0 阅读:0

码哥比特课程

简介:感谢大家的关注