取消阻止`poll`?

时间:2015-08-09 23:13:00

标签: c++ c blocking

所以,我遇到了这个问题,我有很多线程在不同的文件描述符上调用poll。当我想添加一个新的时,我需要取消其中一个民意调查,添加一个新民意调查,然后继续。仅此一点听起来很糟糕,但我甚至看不到如何做到这一点。

一些相关代码:

struct pollfd fds[size];
for(int i = 0;i<size;i++) {
    struct pollfd fd;
    fd.fd = body[i];
    fd.events = POLLIN;
    fd.revents = 0;
    fds[i] = fd;
}
if(poll(&fds[0], (nfds_t)size, -1) < 0) return NULL;

(我也通过JNI使用它。)

我认为我可以在民意调查中设置一个非常低的延迟,并反复调用它,但我认为这将开始打败目的。

2 个答案:

答案 0 :(得分:3)

你可以这样做:打开一个套接字或一个管道,当有一个新的文件描述符要添加到一个轮询集时,另一个线程发送一些数据。因此,poll将返回,您检查此保留文件描述符。如果有数据,则表示需要添加新的文件描述符。

答案 1 :(得分:1)

您可以向您的流程发送信号,导致poll()返回-1并将errno设置为EINTR。信号显然不会导致进程终止,因此您可能需要获得一些sigaction()sigprocmask()。但是,在调用其中任何一个和poll()之间收到的任何信号都可能会丢失,类似于select()/pselect()。出于这个原因,某些系统可能会为poll()提供额外的非标准替换,例如ppoll(),其中包含sigset_t以原子方式更改信号处置。