[英]How to exit a blocking call of recv() on a thread from a different thread?
[英]Blocking recv doesn't exit when closing socket from another thread?
在Linux中,如果我們從一個線程調用阻塞recv
並從另一個線程關閉同一個套接字,則recv
不會退出。
為什么?
“為什么”只是它的設計方式。
在內核中, recv()
調用在與struct file
對應的struct file
上調用了fget()
,這將阻止它在相應的fput()
之前被釋放。
你只需要改變你的設計(無論如何你的設計都是天生的 - 為了實現這一點,你必須沒有鎖定保護用戶空間中的文件描述符,這意味着close()
可能發生在 recv()
調用之前 - 文件描述符甚至被重用於其他東西)。
如果你想喚醒另一個在文件描述符上阻塞的線程,你應該讓它在select()
上阻塞,而是在主線程可以寫入的文件描述符集中包含一個管道。
檢查套接字的所有文件描述符是否已關閉。 如果在“遠程端”仍然打開(假設這是您嘗試關閉的那個),則“ 對等體未執行有序關閉 ”。
如果仍然無效,請在遠程端調用shutdown(sock, SHUT_RDWR)
,無論引用計數如何,都將關閉套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.