【问题标题】:Causing a waiting thread to return to userspace导致等待线程返回用户空间
【发布时间】:2016-02-17 22:08:14
【问题描述】:

是否可以唤醒正在等待 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 确实获得了 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");
}

我尝试从线程 C 发送信号:- pthread_kill(tid_of_B, SIGSYS);

我做错了什么?线程B可以被唤醒吗?如果是这样,我应该使用其他方法吗?

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

【问题讨论】:

  • 理论上,我认为向它发送信号应该可以工作。如果你让线程忙等待或sleep(),然后发送信号,你的处理程序会被调用吗?
  • 我建议不要在信号处理程序中调用异步不安全函数,即使是调试也是如此。如果你真的需要记录你的信号处理程序的调用,write()STDERR_FILENO
  • pthread_kill()的调用返回哪个值?
  • 另外,如果你进行系统调用,你应该使用futex()库函数包装器。
  • 您是否考虑过使用普通的 pthreads 互斥锁而不是 futex?正如文档所说,“裸 futexes 并不是最终用户易于使用的抽象”。我强烈建议您首先让您的系统尽可能简单地工作。只有当速度不够快时,您才应该考虑使用 futexes 或其他深奥的技术来加快速度。即便如此,找到一种更好的算法通常比调整现有算法以加快速度更有优势。

标签: c linux multithreading mutex futex


【解决方案1】:

一些事情。

您使用的是FUTEX_LOCK_PI,它在手册页中不是。我刚刚查看了内核源代码和文档,看来这个版本仅用于内核 本身。它用于实现“PI mutex”以替代内核spinlock

如果你使用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,...)
}

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2016-12-28
    • 2014-10-06
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多