2014-09-25 266 views
0

我正在嘗試爲我的C代理編寫並行流,其中數據同時寫入並行日誌,同時將其轉發到目標服務器。從本質上講,我期待有2個線程,其中:非阻塞寫入和阻塞recv

  1. 線程執行非阻塞寫緩衝區
  2. 第二個線程並從緩衝區中讀取一個阻塞。

自然地,作者線程可以超出讀者線程。因此,無論何時發生緩衝區溢出,我們都會將其標記爲錯誤。

假設線程1(作者)是線程2(讀者)的5倍。我希望線程1不要放慢速度,並以5倍的速度讀寫器(即緩衝區不應被閱讀器鎖定)。這顯然會導致緩衝區溢出,因爲線程1寫入比線程2正在讀取的速度快得多(我也想捕獲緩衝區溢出)

我的理解是套接字/文件描述符是阻塞的或非阻塞的,不能將操作寫入非阻塞並讀取爲阻塞。我猜這是爲了避免緩衝區溢出。但是,我很滿意緩衝區溢出。

任何人都可以幫助設計如何創建這樣的並行線程,其中生產者是非阻塞的,並且接收器被阻塞?

回答

0

您可以使用select()來阻塞,直到套接字可讀。保持非阻塞模式。如果send()返回-1errno設置爲EAGAINEWOULDBLOCK那麼您將需要使用select()來告訴你何時套接字已成爲可寫再次。只有在send()報告EAGAIN/EWOULDBLOCK時才這樣做,因爲套接字幾乎總是可寫的。

+0

請原諒,如果我的理解不完全正確,我正在調查選擇系統調用。我明白選擇告訴何時文件描述符已準備好進行寫入/讀取I/O操作。我想重新說明我不希望寫操作的速度降低,因爲讀取操作很慢......請選擇幫助我這麼做? – tsar2512 2014-09-25 18:02:26

+1

@nipun是的,它會的。你將使用'select'來阻塞,直到套接字可讀。 – 2014-09-25 18:21:53

+1

@nipun:TCP節流傳輸。如果接收緩衝區填滿,則發送緩衝區被阻止。您可以儘可能多地將數據傳輸到send()中,但是如果接收緩衝區填滿,那麼send()不能接受更多的數據,並且會失敗並返回EAGAIN/EWOULDBLOCK直到接收緩衝區釋放上一些房間。當發生這種情況時,'select()'會告訴你什麼時候send()可以再次接受新的數據。 – 2014-09-25 18:23:42