簡體   English   中英

C / C ++在選擇未決時將套接字添加到fd_set

[英]C/C++ Add socket to fd_set when select is pending

我正在使用Berkeley套接字在Windows / unix多線程服務器應用程序網絡層上工作,偶然發現了一個問題:

  • 我有一個線程在等待給定fd集的選擇。
  • 從另一個線程,我需要向一個fd集添加一個套接字。
  • 由於選擇當前處於待處理狀態,因此無法完成選擇並導致飢餓。

可能的解決方案是將超時添加到選擇中。 我已經看到在某些網站上使用select(距今15年)進行網絡連接。

問題是:
還有其他解決方案嗎? 等待超時仍然會導致某種程度的飢餓,並從選擇等待者線程中占用CPU時間。 我認為可以重新設計應用程序,但是添加套接字也可以從選擇等待者線程不知道(並且絕對應該不知道)的線程中完成,因此無法避免這種情況。

如果沒有,應該選擇哪種超時來達到最佳性能/服務質量?

另請注意,我的確意識到使用更高級的API(iocp,kqueue,...)或可以為我完成任務的lib是一個更好的主意,但在給定的時間點上,這不是我的選擇。

謝謝

創建一個額外的套接字對,並將其中一個套接字添加到每個select 要中斷正在運行的select ,請通過另一個套接字向其發送消息。

僅在Unix方面,可以使用pthread_kill將任何信號(例如SIGUSR1 )發送到等待的線程。 select with,然后返回一個負值,並將errno設置為EINTR 但是在Windows方面沒有類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM