最近有想法把网络库推广成能在线程,同主机进程和不同主机之间的通信的公共中间件。后面两样都可以用 socket。 当然同主机进程也可以用别的,先不想那么多。我要说的线程之间,要实现和 socket 统一的 reactor 通信机制,比较好的是用 Linux 的 eventfd 。

eventfd 是一个相对比较新的东西,资料不多,所以我也是摸着石头过河。基本做法就是用 eventfd_create 创建好文件描述符,随后喂给 epoll_wait。两个线程如果要实现,比如生产者-消费者,就一个读,一个写。

感谢 Unix 的“一切都是文件”思想,把这个机制融合到网络库中没有太大困难。我的测试程序起一个 Reader 线程和一个 Writer 线程,双方各有一个 epoll 循环,通过一个 eventfd 来传递数据,彼此无需上锁就可以实现同步。

如果是要做一些很简单的事,这样当然反而麻烦了。但是最大好处是:这种机制在线程间,进程间和主机间都一致,所以是有可能让代码(至少是业务代码)无需修改就能任意伸缩的。这也是中间件的好处。

刚才测试了一下线程之间用这种办法通信的性能,个人还比较满意,我测的部分是

1. Writer 往 eventfd 写一个数,然后等着

2. Reader 线程接到 epoll 的通知,醒过来把事件发到事件处理者

3. 事件处理者从 eventfd 把数据读出来

整个过程涉及数个系统调用,以及线程切换,测试表明平均大约花费30微秒,这已经非常不错了。

linux线程同步 eventfd,用 eventfd 在线程之间通信相关推荐

  1. Linux线程同步(二)---互斥锁实现线程同步

    一 why 先给自己打个广告,本人的微信公众号:嵌入式Linux江湖,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题. 在博客&l ...

  2. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  3. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】...

    方法一:传统的线程方法import org.apache.log4j.Logger;/*** 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/>* 锁是上 ...

  4. (三)线程同步工具集_1---控制线程并发访问一个资源

    2019独角兽企业重金招聘Python工程师标准>>> 线程同步工具集 在前面了解了线程的同步机制,临界区等,了解了线程的两种基本的同步机制: synchronized关键字: Lo ...

  5. 线程同步,为什么要引入线程同步?

    线程同步,为什么要引入线程同步? 多个线程同时访问共享资源时候,如果没有先来后到,可能造成结果的不可再现性,使得结果背离预期的结果,例如多人抢少量票,银行取钱等. 线程同步的实现是依靠队列和锁来实现的 ...

  6. java 线程同步的list_java集合框架线程同步代码详解

    List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...

  7. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  8. Linux系统编程(九)线程同步

    Linux系统编程(九)线程同步 一.什么是线程同步? 二.互斥量 三.条件变量 pthread_cond_wait函数 pthread_cond_signal函数 生产者和消费者模型 一.什么是线程 ...

  9. 【Linux下】 线程同步 生产者与消费者模型

    文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...

  10. linux线程同步的方法

    #Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...

最新文章

  1. python中什么是字符举例说明_第20p,什么是字符串?Python中的str
  2. python类的参数传递
  3. 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
  4. web -httpd
  5. 4周,从入门小白到爬虫老炮儿,薪资水平超过60% IT新手!
  6. boost::mpl模块实现single_view相关的测试程序
  7. apk的签名文件(两次Hash+加密)
  8. oracle 容器切换,oracle12c 多租户管理四(容器连接切换)
  9. 【java设计模式】迭代子模式
  10. vs2012编译使用lua 5.2静态库
  11. 如何判断国际会议是否被EI收录
  12. LeetCode Python实现 链表简单部分
  13. 让FLASH背景透明-可运用于在网页内的FLASH内嵌入另一个网页
  14. Python下使用tarfile模块来实现文件归档压缩与解压
  15. 05-基础widgets
  16. 海洋cms index.php被修改,海洋CMS(SEACMS)新版本V6.55补丁仍可被绕过执行任意代码...
  17. 第三方服务之Bmob——快速入门
  18. ORA-39097:Data Pump job encountered unexpected error 06502
  19. 气象环境监测系统有哪些组成设备
  20. iOS访问 self-signed(自签名) HTTPS

热门文章

  1. Java基础知识Set、List、Map的区别
  2. Linux下source命令
  3. 20165235 第十周课下补做
  4. flask第二十篇——模板【3】
  5. @Html.ActionLink方法
  6. redis中不同value类型的存取操作方式
  7. FCLK、HCLK、PCLK
  8. Socket通信客户端设计(Java)
  9. 二十大数据可视化工具(二)
  10. url即统一资源定位符