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

2021-06-06 22:21:48 字數 522 閱讀 7661

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強制殺掉執行緒

**:

從另乙個執行緒更新GUI製作容易

介紹 我發現,即使是在後台執行緒中完成的簡單操作需要更新介面,也需要強制這些介面呼叫返回到相同的執行緒中,因為介面在 經過一些研究,我發現這是用invoke方法完成的。起初,我建立了數百個委託 函式來處理每個控制項的更新,但現在,雖然我發布的這個解決方案可以更好,但至少對我來說,它節省了不少時間,所...

在乙個執行緒加鎖,另乙個執行緒解鎖

一般來講,乙個執行緒加鎖,另乙個執行緒解鎖,是很容易死鎖的。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。4 迴圈等待條件 若干程序之間形成...

java 乙個執行緒控制另乙個執行緒

兩種方法,乙個用標記變數,另乙個用語法 不多說,直接 主方法一 send s new send s.start receive r new receive r.start class send extends thread s system.out.println s sleep 500 catch...