Можно ли разбудить поток, ожидающий блокировку фьютекса? Я пытался использовать сигнальный механизм, но, похоже, он не работает. Есть ли другие подходы, которые я мог бы попробовать? Ниже я добавил пример, который может быть похож на то, чего я пытаюсь достичь.
У меня есть поток 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 и понял, что вызов не возвращается.
sleep(), а затем отправляете сигнал, вызывается ли ваш обработчик? - person abligh   schedule 16.11.2015write()toSTDERR_FILENO. - person EOF   schedule 16.11.2015syscall()не является хорошей идеей, так как базовые номера вызовов и список параметров могут меняться от одного обновления ОС к другому. Предлагайте всегда вызывать библиотечную функцию. в этом случае я думаю, что вызовmutex_lock()проще, понятнее и намного надежнее. - person user3629249   schedule 16.11.2015pthread_kill()? - person alk   schedule 16.11.2015futex(7)). В частности, обычно вы делаете системный вызов как часть приобретения фьютекса только в случае, когда получение оспаривается. Поскольку это именно тот случай, когда вы хотите, чтобы поток B избегал блокировки, возможно, это признак того, что вы хотите вообще избежать этого системного вызова. - person John Bollinger   schedule 16.11.2015futex(). - person John Bollinger   schedule 16.11.2015futex(), чтобы проверить правильность вашего кода сигнала. Очевидно, это не то, что вы хотите сделать, но это может указать вам правильное направление (проблема, характерная дляfutex(), а не проблема с обработкой сигнала). - person abligh   schedule 16.11.2015