linux线程同步 eventfd,用 eventfd 在线程之间通信
最近有想法把网络库推广成能在线程,同主机进程和不同主机之间的通信的公共中间件。后面两样都可以用 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 在线程之间通信相关推荐
- Linux线程同步(二)---互斥锁实现线程同步
一 why 先给自己打个广告,本人的微信公众号:嵌入式Linux江湖,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题. 在博客&l ...
- java实现线程同步的方法_Java实现线程同步方法及原理详解
一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】...
方法一:传统的线程方法import org.apache.log4j.Logger;/*** 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/>* 锁是上 ...
- (三)线程同步工具集_1---控制线程并发访问一个资源
2019独角兽企业重金招聘Python工程师标准>>> 线程同步工具集 在前面了解了线程的同步机制,临界区等,了解了线程的两种基本的同步机制: synchronized关键字: Lo ...
- 线程同步,为什么要引入线程同步?
线程同步,为什么要引入线程同步? 多个线程同时访问共享资源时候,如果没有先来后到,可能造成结果的不可再现性,使得结果背离预期的结果,例如多人抢少量票,银行取钱等. 线程同步的实现是依靠队列和锁来实现的 ...
- java 线程同步的list_java集合框架线程同步代码详解
List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...
- Java多线程之线程同步机制(锁,线程池等等)
Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...
- Linux系统编程(九)线程同步
Linux系统编程(九)线程同步 一.什么是线程同步? 二.互斥量 三.条件变量 pthread_cond_wait函数 pthread_cond_signal函数 生产者和消费者模型 一.什么是线程 ...
- 【Linux下】 线程同步 生产者与消费者模型
文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...
- linux线程同步的方法
#Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...
最新文章
- python中什么是字符举例说明_第20p,什么是字符串?Python中的str
- python类的参数传递
- 二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
- web -httpd
- 4周,从入门小白到爬虫老炮儿,薪资水平超过60% IT新手!
- boost::mpl模块实现single_view相关的测试程序
- apk的签名文件(两次Hash+加密)
- oracle 容器切换,oracle12c 多租户管理四(容器连接切换)
- 【java设计模式】迭代子模式
- vs2012编译使用lua 5.2静态库
- 如何判断国际会议是否被EI收录
- LeetCode Python实现 链表简单部分
- 让FLASH背景透明-可运用于在网页内的FLASH内嵌入另一个网页
- Python下使用tarfile模块来实现文件归档压缩与解压
- 05-基础widgets
- 海洋cms index.php被修改,海洋CMS(SEACMS)新版本V6.55补丁仍可被绕过执行任意代码...
- 第三方服务之Bmob——快速入门
- ORA-39097:Data Pump job encountered unexpected error 06502
- 气象环境监测系统有哪些组成设备
- iOS访问 self-signed(自签名) HTTPS