2015-05-23 33 views
0

我有一個用於寫入操作(發送)的非阻塞套接字。select()在非阻塞套接字上VS「手動輪詢」

我想知道,如果選擇()是檢測的唯一方法: - 插座時,連接返回EINPROGRESS 進行連接成功完成 - 插座的寫操作的可用性時,發送回EWOULDBLOCK或EGAIN

輪詢替代選擇()?在我的應用程序中,我已經有一個線程每隔1秒喚醒一次,如果connect()返回0(連接正常),並且返回0(發送正常),如果必須發送一些字節,可以循環檢查。

回答

0

輪詢替代選擇()?

這是一種選擇,但不是一個好的選擇。你不知道睡多久。 select()呢。平均來說,手動調查每次嘗試所需的時間必須爲所需時間的兩倍,並在循環直至成功時浪費CPU週期。 select()沒有任何這些問題。

+0

感謝您的有用答案。幸運的是,在我的應用程序中,如上所述,我已經有了一個「輪詢線程」來完成一些工作。雖然(你是對的)它會浪費CPU週期,我可以添加如下代碼:'代碼' while(某些條件成立) \t做一些事情; \t呼叫連接; \t \t如果連接不返回零 \t \t \t計數失敗; \t sleep(1); 結束,而 while(某些條件成立) \t做一些東西; \t呼叫發送; \t \t如果發送不返回零 \t \t \t計數失敗; \t sleep(1); end while 'code' – epok

+0

很明顯,在之前的評論中,如果我達到閾值失敗,我退出線程循環。 – epok