解決 recvfrom的 阻塞

2021-07-13 14:04:17 字數 509 閱讀 3052

udp的多執行緒程式,一般開乙個執行緒迴圈呼叫recvfrom接收訊息,當程式中止的時候,如果這個執行緒阻塞在recvfrom呼叫,並且沒有訊息到達,則這個執行緒無法終止,造成資源洩露等問題。

這裡終止這個執行緒有六種方法:

1.釋放監聽的fd,這個是最簡單的方法,但是有一點要注意,就是close(fd)系統呼叫無效,必須要使用shutdown(fd,shut_rdwr)來將recvfrom喚醒,因為close只關閉寫信道,recvfrom在fd的寫信道等待列表中,只要關閉寫信道時才會將recvfrom阻塞喚醒。

2. 在呼叫recvfrom前將recvfrom的fd設定乙個超時,這個超時時間較難設定,但比較簡單,也容易實現

3. 在呼叫recvfrom前將recvfrom的fd設定為非阻塞的,這個方法容易導致迴圈過快,cpu使用率上公升

4. 使用select/epoll來接收,

5. fake乙個訊息包發給這個相應的埠

6. pthread_cancel強制殺掉執行緒

UDP服務recvfrom函式設定非阻塞

其實udp的非阻塞也可以理解成和tcp是一樣的,都是通過socket的屬性去做。方法一 通過fcntl函式將套接字設定為非阻塞模式。方法二 通過套接字選項so recvtimeo設定超時。只是linux 下的情況 阻塞模式和非阻塞模式下send sendto recv recvfrom的表現 在li...

解決session阻塞的問題

原文 解決session阻塞的問題 對於資料庫運維人員來說建立session或者查詢時產生問題是常規情況,下面介紹一種很有效且不借助第三方工具的方式來解決類似問題。最近開始接觸運維工作,所以自己總結一些方案便於不懂資料庫的同事解決一些不太緊要的資料庫問題。類似方法很多理論也很多,我就不做深究,就是簡...

從另乙個執行緒將recvfrom從阻塞狀態喚醒

udp的多執行緒程式,一般開乙個執行緒迴圈呼叫recvfrom接收訊息,當程式中止的時候,如果這個執行緒阻塞在recvfrom呼叫,並且沒有訊息到達,則這個執行緒無法終止,造成資源洩露等問題。這裡終止這個執行緒有六種方法 1.釋放監聽的fd,這個是最簡單的方法,但是有一點要注意,就是close fd...