Можно ли разбудить поток, ожидающий блокировку фьютекса? Я пытался использовать сигнальный механизм, но, похоже, он не работает. Есть ли другие подходы, которые я мог бы попробовать? Ниже я добавил пример, который может быть похож на то, чего я пытаюсь достичь.
У меня есть поток A, который получает блокировку фьютекса "lockA" следующим образом: -
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);У меня есть поток B, который пытается получить блокировку фьютекса "lockA" и блокируется в ядре, поскольку поток A получил блокировку.
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);Если поток B получит блокировку A, другой поток, поток C, узнает об этом. Если поток B не получает блокировку, поток C хотел бы, чтобы поток B прекратил ожидание блокировки и сделал что-то другое.
Итак, в основном, на данный момент я пытаюсь выяснить, могу ли я заставить поток C "сигнализировать" потоку B, чтобы он больше не блокировался в ядре. Для этого я установил обработчик сигнала в потоке B следующим образом:
struct sigaction act;
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_restorer = NULL;
sigaction(SIGSYS, &act, NULL);
...
...
void handler() {
fprintf(stderr, "Inside the handler, outta the kernel\n");
}
Из потока C я пытаюсь отправить сигнал как: - pthread_kill(tid_of_B, SIGSYS);
Что я делаю не так? Можно ли вообще разбудить поток B? Если да, следует ли использовать другой подход?
[EDIT] Основываясь на комментарии ниже, я попытался проверить возвращаемое значение из pthread_kill и понял, что вызов не возвращается.