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.内容协议

    还是由接收方负责停止程序,双方约定:如果接收方接收到特定的字符( 由发送方发过来,表示结束符号 ),则停止程序。

参考资料

[1]linux 线程(FIFO)先进先出

[2]linux管道的那点事

[3]多线程+管道的用法

[4]linux 管道 线程同步

[5]Linux创建FIFO文件类型的方法

[6]Linux学习之——FIFO实例

[7]UNIX环境高级编程,第2版,P398

[8]Linux程序设计,第4版,人民邮电出版社,P456

Logo

更多推荐