Linux线程间数据交换——管道篇
参考资料[1]linux 线程(FIFO)先进先出[2]linux管道的那点事
1 管道
最近在做一个有关AD数据采集的项目,有一个采集线程,一个数据处理线程。为了实现线程之间的数据传输,我选择使用管道。然而管道又分为两种:PIPE和FIFO。参考资料[7]中对这两种管道进行了对比:PIPE只能在具有公共祖先的进程之间使用,而FIFO则没有这个限制。然而实践证明,不管是PIPE还是FIFO,都可以用于线程间数据传输(从某种意义上而言,线程也就是轻量级的进程而已)。
关于管道的详细说明,见参考资料[7][8],其中参考资料[8]有非常详细的编程介绍。
2 实现方法
2.1 PIPE实现线程间数据传输
参考资料[3][4]都给出了相关实现代码。
2.2 用FIFO实现线程间数据传输
见参考资料[6][7]。
3 何时结束程序
线程A负责写数据到管道,线程B负责从管道中读取数据。现在有个问题是:程序该何时停止?主要有两种方案。
3.1 发送线程负责停止
当发送线程发送完数据后,直接退出程序。
缺点:接收线程可能还没有把数据接完,从而导致数据丢失。
3.2 接收线程负责停止
当没有数据发送过来时,直接退出线程。
缺点:或许等待一段时间后,发送线程将会再次发送数据,但是这时候程序已经被接受线程结束了,从而导致数据丢失。
3.3 解决方案
为了协调两个线程的数据传输,需要在它们之间制定一个协议,用于说明什么时候该结束程序。
3.3.1 时间协议
由接收线程负责停止程序,双方约定:在间隔一段时间( 如2s )之后如果接收不到数据,则默认发送方没有更多的数据传输过来了,因此接收方可以结束程序。
3.3.2.内容协议
还是由接收方负责停止程序,双方约定:如果接收方接收到特定的字符( 由发送方发过来,表示结束符号 ),则停止程序。
参考资料
[2]linux管道的那点事
[3]多线程+管道的用法
[7]UNIX环境高级编程,第2版,P398
[8]Linux程序设计,第4版,人民邮电出版社,P456
更多推荐
所有评论(0)