(Игнорирование всей части вопроса о сигнале и ответ только на
Если у меня есть потоки (производители и потребители), и каждый (потребительский) поток использует 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 недоступен, вы можете заменить его на классический c (и более подробный) канал или другой аналогичный механизм связи.