1. 程式人生 > >從另一個執行緒將recvfrom從阻塞狀態喚醒

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

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