簡體   English   中英

在多線程程序中關閉文件描述符

[英]Closing file descriptor in multithreaded program

我有一個線程可以接受傳入的連接:

pthread_t thread;

pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);

然后worker_func執行:

<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>

但是,如果我嘗試在原始線程中關閉GlobalFD ,則accept仍然會阻塞(如果關閉GlobalFD ,我希望它失敗)。 我在網上看過其他問題,但似乎找不到我特定問題的答案。

有任何想法嗎? 謝謝

同一程序的不同線程共享內存,包括文件描述符表。 如果一個線程關閉了FD,那么其他所有線程也都關閉了。 這是使用多個線程和使用多個進程之間的區別之一。 因此,不允許一個線程關閉另一個依賴的文件描述符以保持打開狀態。

但是,更一般而言,您必須非常注意修改共享數據。 一般來說,您必須通過信號量,條件變量或其他對同步有意義的構造或操作來同步訪問。 否則,程序行為將無法很好地定義。 特別是,您不能期望關閉文件描述符會導致在其他線程中運行的活動I / O函數終止。 向目標線程發送信號。

通常,不能保證在一個線程中關閉文件描述符會導致正在另一個線程中等待該文件描述符的函數返回。

您的選擇是1)安裝信號處理程序並使用pthread_kill()(不要忘記檢查被阻止函數的返回碼),以及2)創建“終止文件描述符”,該文件也將傳遞給select()或poll()函數,然后在另一個線程中將其關閉或寫入。

祝好運。

暫無
暫無

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

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