1. 程式人生 > >Linux執行緒間資料交換——管道篇

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.內容協議

    還是由接收方負責停止程式,雙方約定:如果接收方接收到特定的字元( 由傳送方發過來,表示結束符號 ),則停止程式。

參考資料

[7]UNIX環境高階程式設計,第2版,P398

[8]Linux程式設計,第4版,人民郵電出版社,P456