2013-05-19 43 views
0

如果我有下面的代碼選擇調用,並假設套接字fds沒有準備好大部分時間的I/O,線程將CPU或睡覺,讓其他線程完成這項工作。 select()是一個CPU密集型呼叫嗎?select()套接字調用CPU消耗

while(1) 
{ 
    select(maxfd, &rfds, NULL, NULL, NULL); 
} 

行爲是否與timeout = 0(輪詢類型)相同而不是NULL。

+0

select()如何在無限制阻塞後恢復?誰將通知選擇被阻止的線程? –

回答

2

如果超時值爲NULL,select將無限期阻塞,直到rfds中的套接字和文件描述符上的數據可用。但是,只要該組中的任何文件描述符上的數據可用,您所擁有的代碼將消耗整個CPU,因爲您沒有顯示任何暗示將數據從套接字中排除的事情。 (第二次選擇將立即返回,表示套接字上還有數據)。

如果你傳入一個零時間的timeval來選擇,它將是一個非阻塞輪詢。這相當於使用MSG_DONTWAIT標誌調用send()或recv()(但沒有複製數據)。

+0

感謝您的信息。雖然無限期阻塞,線程是否會消耗CPU? –

+0

不,線程和進程阻塞時不消耗CPU。 – selbie