gpt4 book ai didi

使等待线程返回用户空间

转载 作者:太空狗 更新时间:2023-10-29 11:21:46 25 4
gpt4 key购买 nike

是否有可能唤醒等待 futex 锁的线程?我试过了使用信号机制,但它似乎不起作用。还有其他方法吗我可以试试吗?下面,我添加了一个可能与我的示例类似的示例努力实现。

  1. 我有一个线程 A 获取 futex 锁“lockA”,如下所示:-ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);

  2. 我有一个线程 B 试图获取 futex 锁“lockA”,并在内核中阻塞,因为线程 A 已经获得了锁。ret = syscall(__NR_futex, &lockA, FUTEX_LOCK_PI, 1, 0, NULL, 0);

  3. 如果线程 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完全可以被唤醒吗?如果是这样,我应该使用其他方法吗?

[编辑]根据下面的评论,我尝试检查 pthread_kill 的返回值并意识到调用没有返回。

最佳答案

一些事情。

您正在使用 FUTEX_LOCK_PI,它在手册页中。我刚刚查看了内核源代码和一份文档,看来这个版本仅供在内核 内部使用。它用于实现“PI 互斥锁”以替代内核 自旋锁

如果你使用 futex,你必须在它指向的地址中实现数据的语义。

这是一个粗略的伪代码,并且可能/可能是错误的示例:

int mysem = 1;

void
lock(void)
{

// atomic_dec returns new value
while (1) {
if (atomic_dec(&mysem) == 0)
break;
futex(&mysem,FUTEX_WAIT,...)
}
}

void
unlock(void)
{

// non_atomic_swap returns old value
if (non_atomic_swap(&mysem,1) != 0)
futex(&mysem,FUTEX_WAKE,...)
}

关于使等待线程返回用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33741664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com