等待时中断pselect-多线程

时间:2020-03-30 08:06:21

标签: c multithreading signals

因此,根据手册,ShareViewModel可以具有一个超时参数,如果没有文件描述符更改,它将等待。另外,它还可以通过信号中断:

pselect

但是,从手册来看,哪些信号能够中断pselect?

如果我有线程(生产者和使用者),并且每个(消费者)线程都使用pselect,是否有办法从另一个(生产者)线程中仅中断一个(消费者)线程?

2 个答案:

答案 0 :(得分:1)

我认为该问题已在 https://lwn.net/Articles/176911/

中进行了分析

因此,POSIX.1g委员会设计了增强版的 select(),称为pselect()select()pselect()是,后一个呼叫具有信号掩码(sigset_t) 作为 附加参数:

int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);

pselect使用sigmask参数来配置哪些信号可以中断

当前被阻止的信号集合称为 信号屏蔽。每个过程都有自己的信号掩码。当您创建一个 新流程(请参见创建流程),它会继承其父级的蒙版。 您可以通过修改来完全灵活地阻止或取消阻止信号 信号屏蔽。

源:https://www.gnu.org/software/libc/manual/html_node/Process-Signal-Mask.html

https://linux.die.net/man/2/pselect

https://www.linuxprogrammingblog.com/code-examples/using-pselect-to-avoid-a-signal-race

由于您的第二个问题,请参见https://www.geeksforgeeks.org/introduction-of-process-synchronization/以及此页面或https://en.wikipedia.org/wiki/Sleeping_barber_problem及其相关页面上的链接,其中提供了多种用于流程同步的算法。因此,基本上,信号只是Linux中IPC的一条路径,请参见IPC using Signals on linux

答案 1 :(得分:1)

(忽略问题的所有信号部分,仅回答

如果我有线程(生产者和消费者),并且每个线程(消费者) 使用pselect,有没有办法只中断一个 (使用者)来自另一个(生产者)线程的线程?”

,因为标题并不意味着使用信号。

我知道的最简单的方法是让线程公开一个文件描述符,该文件描述符将始终包含在p / select监视的描述符中,因此它始终监视至少一个。如果其他线程对此进行了写入,则p / select调用将返回:

struct thread {
    pthread_t tid;
    int wake;
    ...
}

void *thread_cb(void *t) {
    struct thread *me = t;
    t->wake = eventfd(0, 0);
    ...
    fd_set readfds;
    // Populate readfds;
    FD_SET(t->wake, &readfds);
    select(...);
}

void interrupt_thread(struct thread *t) {
    eventfd_write(t->wake, 1);
}

如果没有可用的eventfd,则可以将其替换为经典(且更为冗长)的管道或其他类似的通信机制。