是否有可能唤醒正在等待 futex 锁的线程?我尝试使用信号机制,但它似乎不起作用。还有其他我可以尝试的方法吗?下面,我添加了一个可能与我想要实现的目标相似的示例。
我有一个线程 A 获取 futex 锁“lockA”,如下所示:-
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);
我有一个线程 B 试图获取 futex 锁“lockA”,并在内核中阻塞,因为线程 A 已经获取了锁。
ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);
如果线程 B 确实获得了 lockA,另一个线程 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");
}
从线程 CI 尝试将信号发送为:-
pthread_kill(tid_of_B, SIGSYS);
我究竟做错了什么?线程B可以被唤醒吗?如果是这样,我应该使用另一种方法吗?
[编辑] 根据下面的评论,我尝试检查 pthread_kill 的返回值并意识到调用没有返回。