簡體   English   中英

在另一個線程接收的套接字上觸發EAGAIN

[英]Trigger an EAGAIN on a socket receiving on another thread

假設我有兩個線程,即主線程和專用於在標准TCP套接字上連續偵聽的線程。 現在,說在某個時候我想關閉一切。 我想從主線程中關閉正在監聽的線程的連接,然后加入線程並結束程序。

但是,這很棘手,因為我不知道如何使監聽線程從read調用返回。 該呼叫將不會返回,除非實際上收到了一些東西,並且原則上我可能會等待很長時間,直到另一個端點決定向我發送東西。

當我使用UDP套接字時,我曾經通過從回送接口在該端口上發送數據包來解決此問題,因此觸發了recvfrom的返回。 但是,這非常糟糕,無法在TCP套接字上完成。

我知道另一種解決方法可能是使用setsockopt設置超時:這樣可以保證調用最終會返回,但這也很麻煩,而且效率很低,因為我可能要等待幾秒鍾才能加入線程。

所以我想知道是否有某種方法可以在套接字read調用中觸發EAGAIN ,與我超時的方法不同,因此在我的主線程上,我可以在套接字描述符上調用一些force_return並調用在其他線程上read會返回嗎?

我通常通過創建pipe ()並在讀取線程中使用select()解決此問題。 讀取線程必須同時在TCP套接字和管道的一端選擇。 每當您想關閉閱讀器時,都設置一個標志並將一些數據寫入管道的另一端。

設定:

#include <unistd.h>

int signalPipe[2];

...

pipe(signalPipe);

讀者:

while(running)
{
    FD_ZERO(&fds);
    FD_SET(tcpSocket, &fds);
    FD_SET(signalPipe[0], &fds);
    select(max(tcpSocket, signalPipe[0]) + 1, &fds, NULL, NULL, NULL);
    ...
}

其他線程:

// We want to stop now.
running = false;
write(signalPipe[1], "foo", 3);

暫無
暫無

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

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