“最近在做F-Stack相关内容,F-Stack协议栈单线程独占异步轮询网卡,所以要求异步。但是又有多线程需要利用F-Stack进行发包,并且发包ff_sendto需要由F-Stack线程调用,就这样引入了此篇命题。”

整体结构

Talk is cheap,show me the code首先我们需要管道文件描述符。

/* 管道两头的FD */static int pipe_fd[2] = {-1};/* 管道两头的打开方式 */static FILE *pipe_in_fp = NULL;static FILE *pipe_out_fp = NULL;

关于异步多路复用,我们采用epoll(关于epoll也进行过讲解:浅谈epoll)。

/* epoll fd */static int epoll_fd = -1;/* epoll events */static struct epoll_event epoll_evs[MAX_EVENTS];

使用连个线程向管道发送数据,一个线程用于管道数据的接收。

/* 管道两头的线程 */static pthread_t tpipe_in1;static pthread_t tpipe_in2;static pthread_t tpipe_out;

初始化管道相当简单。

/* 初始化管道 */void pipe_initial() {  pipe(pipe_fd);      /* 打开管道两端 */    pipe_in_fp = fdopen(pipe_fd[1], "w");    pipe_out_fp = fdopen(pipe_fd[0], "r");}

使用epoll对管道出口进行监听。

/* 初始化epoll */void epoll_initial() {  epoll_fd = epoll_create(1);  struct epoll_event pipe_ev;  pipe_ev.data.fd = fileno(pipe_out_fp);  pipe_ev.events = EPOLLIN;  epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fileno(pipe_out_fp), &pipe_ev);}

接下来,启动线程。

/* 启动任务 */void thread_execute() {  pthread_create(&tpipe_in1, NULL, thread_pipe_in, NULL);  pthread_create(&tpipe_in2, NULL, thread_pipe_in, NULL);  pthread_create(&tpipe_out, NULL, thread_pipe_out, NULL);  pthread_setname_np(tpipe_in1, "pipe-in1");  pthread_setname_np(tpipe_in2, "pipe-in2");      pthread_setname_np(tpipe_out, "pipe-out");    }

按照以上循序进行初始化。

/* 主函数 */int main () {  pipe_initial();/* 初始化管道 */    epoll_initial();/* 初始化epoll */  thread_execute();/* 开始执行任务 */  main_loop();/*主循环,由主进程执行 */}

--往期回顾--浅谈epollF-Stack实现UDP服务端、客户端吞吐量测试F-Stack DPDK lcore与cpe_set的配置点击“阅读原文”,查看源码。

pthread异步_异步管道的实现相关推荐

  1. activemq java 异步_异步消息处理机制之activeMQ应用实例

    上篇说了KAFKA应用实例,本篇承接上篇,着重描述activeMQ消息机制的应用. KAFKA和MQ同为数据异步处理中间件,本质都是对消息的异步处理,异步通信.削谷填峰,高并发情况下的数据处理机制.他 ...

  2. python 异步io_python异步IO编程(一)

    python异步IO编程(一) 基础概念 异步IO (async IO):一种由多种语言实现的与语言无关的范例(或模型). asyncio:Python 3.4版本引入的标准库,直接内置了对异步IO的 ...

  3. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);     public clas ...

  4. springboot异步和切面_Spring异步编程 | 你的@Async就真的异步吗 ☞ 异步历险奇遇记...

    引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们bia~ji~一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: ...

  5. springboot异步和切面_Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记

    Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记 点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 引 ...

  6. java 什么是异步_java异步是什么意思

    本篇文章将对Java异步进行介绍,希望对大家有所帮助. 异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作. 也就是说无论异步方法执行代码需要多长时间,跟 ...

  7. 【代码】javascript - (异步/非异步) - 进度条

    文章目录 # 异步 # 非异步 # 异步 <!DOCTYPE html> <html lang="en"><head><meta char ...

  8. 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞

    今天老师讲了同步阻塞 同步非阻塞 异步阻塞 异步非阻塞.讲完感觉老师自己说的都是前后矛盾的.去网上找了几篇大佬的博客,看完后才有点点感悟.特地小结记下来,若有错误之处,欢迎大家斧正. 首先先弄清楚同步 ...

  9. 简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞

    简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞 声明:本篇思想非原创,系从老师处听来.因为CSDN发转载需要有原文链接,本篇没有原文链接,所以填的原创. 举个栗子 1.你在家做饭,用普通的汤 ...

最新文章

  1. 硬盘盘符无法识别或已损坏,别急着格式化
  2. html文档打开错误,我的html的文档无法打开,打开也是报错
  3. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——内置节点总览
  4. 使用Docker-数据卷命令
  5. gradient渐变IE兼容处理
  6. Specified VM install not found: type Standard VM, name jdk1.7
  7. 工业互联网二级节点建设_建设者还是二传手?
  8. VB讲课笔记03:对象及其操作
  9. java 获取路径_java 获取当前类的路径
  10. Tricks(四十八)—— 注释一段代码
  11. 深入了解什么是服务网格
  12. Vmware虚拟机桥接模式设置
  13. php微信昵称保存,附件十四 存储微信昵称的处理方法
  14. (FFT)快速傅里叶变换在目标跟踪中的运用
  15. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02EC20模组硬件供电和开关机复位操作
  16. 龙贝格求积分算法例题_数值分析实习作业之龙贝格求积
  17. Excel+VBA+之快速上手(2)
  18. 上传图片方向不对 php,如何解决IOS中html5上传图片方向问题?
  19. ARM-Linux嵌入式系统启动流程
  20. 2、开源GPS项目HD-GR GNSS的自叙

热门文章

  1. 杭电5256 序列变换(LIS)
  2. nginx redis mysql_Nginx + Lua + Kafka + Redis + Mysql
  3. cpu使用率_微软:Windows 10的高CPU使用率问题已解
  4. linqto 多个关键字模糊查询_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  5. go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
  6. ctfshow-WEB-web10( with rollup注入绕过)
  7. SQLi LABS Less-6 报错注入+布尔盲注
  8. springboot 支付宝电脑支付
  9. chromedriver 版本
  10. 从Nest到Nesk -- 模块化Node框架的实践