目录

架构

代码

相关阅读


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

架构

代码

/*** 异步管道*   rongtao@sylincom.com*  2020年8月4日11:11:03*/#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <pthread.h>
#include <sys/epoll.h>
#include <string.h>/* epoll最大event数 */
#define MAX_EVENTS 64/* 管道两头的线程 */
static pthread_t tpipe_in1;
static pthread_t tpipe_in2;
static pthread_t tpipe_out;/* 管道两头的FD */
static int pipe_fd[2] = {-1};/* 管道两头的打开方式 */
static FILE *pipe_in_fp = NULL;
static FILE *pipe_out_fp = NULL;/* epoll fd */
static int epoll_fd = -1;/* epoll events */
static struct epoll_event epoll_evs[MAX_EVENTS];/* 向管道发送数据,数据将从另一端输出 */
inline int mysendto(void *buf, size_t size) {int n = write(fileno(pipe_in_fp), buf, size);
//    printf("<< pipe << %s\n", buf);
}/* 管道进口任务1 */
void * thread_pipe_in(void*arg) {char threadname[16];unsigned long int tid = pthread_self();pthread_getname_np(pthread_self(), threadname, 16);while(1) {usleep(tid%521233);char buf[100] = {0};sprintf(buf, "I'm thread %s-%lu.", threadname, tid);mysendto(buf, strlen(buf));}
}/* 管道出口任务主循环 */
int pipe_out_loop(void*arg) {static char buffer[1024] = {0};int nr_events = 0, iev;nr_events = epoll_wait(epoll_fd, epoll_evs, MAX_EVENTS, -1);for(iev = 0; iev < nr_events; iev ++) {if(epoll_evs[iev].data.fd == fileno(pipe_out_fp) && epoll_evs[iev].events&EPOLLIN) {int n = read(fileno(pipe_out_fp), buffer, 1024);printf(">> pipe >> %s\n", buffer);}}}/* 管道出口任务 */
void * thread_pipe_out(void*arg) {while(1) {/* 该loop类比于fstack的ff_run(loop, NULL) */pipe_out_loop(NULL);}
}/* 初始化管道 */
void pipe_initial() {pipe(pipe_fd);/* 打开管道两端 */pipe_in_fp = fdopen(pipe_fd[1], "w");pipe_out_fp = fdopen(pipe_fd[0], "r");}/* 启动任务 */
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");}/* 主进程loop */
void main_loop() {while(1) {sleep(1);/* do nothing */}
}/* 初始化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);
}/* 主函数 */
int main () {pipe_initial();/* 初始化管道 */epoll_initial();/* 初始化epoll */thread_execute();/* 开始执行任务 */main_loop();/*主循环,由主进程执行 */
}

相关阅读

《Linux异步管道多线程速率测试》https://rtoax.blog.csdn.net/article/details/107812606

Linux下实现多线程异步管道相关推荐

  1. Linux下实现多线程的生产者消费者问题

    Linux下实现多线程的生产者消费者问题 一.原理的理解 生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个线程地址空间内执行的两个线程 ...

  2. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  3. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  4. Linux 下的进程间通信:管道、消息队列、共享文件、共享内存

    Table of Contents 无名管道 命名管道 消息队列 共享文件 示例 1. 生产者程序 示例 2. 消费者程序 共享内存 示例 3. memwriter 进程的源程序 示例 4. memr ...

  5. Linux下不使用qt自带sleep,Linux下Qt多线程编程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 技术部 以下和大家分享Linux平台下Qt两种多线程编程的方式: 1.使用Linux平台下的线程函数.以下是给出的代码片段: ...

  6. linux 下的 多线程http 下载器

    Linux下多线程下载工具-Axel Axel是命令行下的多线程下载工具,支持断点续传,速度通常情况下是Wget的几倍. 它的官方网站: http://wilmer.gaa.st/main.php/a ...

  7. Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字

    /* 1,进程间通信 (IPC ) Inter-Process Communication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息.2,linux下IPC机制的分类:管道.信号. ...

  8. linux下的多线程

    多线程:包括线程概念/线程控制/线程安全/线程基本应用 多任务处理:多创建几个进程,一个进程就有一个pcb,能够串行化的完成一个任务,在一个进程中多创建几个pcb,pcb是调度程序运行的描述,有多少个 ...

  9. linux下串口多线程通信 ,多串口收发数据错乱问题解决办法

    最近在写AM335x平台的串口测试工具,最开始的时候写的第一版本,测试一直很ok,但是存在一些缺陷,于是就想改进一下,没想到后面在新的板子测试,竟然发现了以个很致命的问题,在旧系统旧内核测试一切正常, ...

最新文章

  1. c++ 调用labview_LabVIEW面向对象编程_初窥门径(5):开发方式漫谈
  2. uglifyjs压缩js文件
  3. Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结
  4. 东北大学计算机应用基础在线作业,东北大学计算机应用基础
  5. python教程:15种字符串操作方法
  6. CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况
  7. java list 自定义类型转换_使用Java Stream API将List按自定义分组规则转换成Map的一个例子...
  8. 浅谈Android binder原理与设计 (1)
  9. shineblink 雨滴感应传感器
  10. firewall-cmd常用命令
  11. JavaFX之Scene Builder详细使用说明之设置篇(2)——属性Properties
  12. 量化交易策略五_PEG策略
  13. ipv6服务器安装mysql_ipv6安装,教您ipv6安装方法
  14. CF407C Curious Array
  15. 登录计算机隐藏用户名,win10系统隐藏登录界面administrator用户名的办法介绍
  16. 关于 “Ubuntu 18.04.2 LTS _Bionic Beaver_ - Release amd64 (20190210)” 的盘片插入驱动器“/cdrom/”再按「回车」键 的解决问题
  17. CGB2111-Day13-用户模块管理
  18. ps怎么把白色背景变透明
  19. USB口的红外条形码扫描器的另类使用 1
  20. 区块链信息安全(区块链信息安全关键技术研究)

热门文章

  1. Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务
  2. leetcode题解776-旋转字符串
  3. 树莓派打造mini广播(FM)系统
  4. 采用DCT进行图像压缩
  5. Fabric chaincode开发调试
  6. load control template file /_controltemplates/taxonomypicker.ascx failed
  7. oracle 自定义函数 返回一个表类型
  8. 点石成金-3-超市大亨
  9. mysql中加入正则表达式,mysql中的正则表达式搜索
  10. cam350 不能打开光绘文件_CAM350使用教程-复制Gerber层