问题标签 [ucontext]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - `nanosleep()` Linux 上的异步信号安全
我需要nanosleep
在我的用户空间线程库中使用该函数来实现大约所需数量的等待,因为它可以在异步信号中断的情况下节省剩余时间。我使用 SIGALRM 抢先切换线程;因此,重要的是要考虑使用不可重入函数的可能副作用。出于这个原因,如果一个nanosleep
调用被线程切换中断并且从另一个线程或信号处理程序再次调用它,我想知道这种情况是否会导致问题。
显然,nanosleep
函数不是异步信号安全的,因为它没有在此处列出;但是,sleep(3)
据说是异步信号安全的。另一方面,sleep(3)
似乎是nanosleep
在 Linux 上使用实现的。我可以将此作为nanosleep
对我想要实现的目标安全的证据吗?
编辑:根据这个资源,它确实是安全的。
c++ - 关于在用户级线程实现中使用 ucontext.h 的线程切换问题
最近看到一个用ucontext实现的用户级线程,就是不明白线程是怎么切换的。在上面的代码中,swapcontext
完成它的工作之后,threadMap_[lastId].get()
相当的上下文应该在threadSchedule
?但是上下文在带有 lastID 断点的线程中。swapcontext(ucontext_t *oucp, ucontext_t *ucp)
令人困惑的是,保存到的“当前上下文”oucp
不是threadSchedule(int n)
现在函数内部的上下文,而是旧线程的上下文。整个代码在https://github.com/Miaoshuai/Coroutine
c - 在C中使用计时器制作产量函数
我想编写一个代码,每 10 微秒在线程之间切换一次。但问题在于产量函数。运行计时器处理程序时出现中断。所以它没有正确完成。这是我用于初始化计时器的代码:
这是处理函数的代码:
这就是我在 yield 函数中所做的:一个队列,我们从中获取线程接下来运行。问题是在我在线程之间交换上下文之前的任何时刻,我都可以获得中断。特别是因为我在这个函数结束时交换了上下文。
我可以做些什么来确保我首先完成了 yield 函数然后得到了中断?
c - 如何从函数内部调用 ucontext.h getcontext
我正在尝试将 getcontext 调用到另一个函数中(而不是直接将其调用到 main 中),以便复制线程的堆栈并稍后恢复它。此代码应重复打印,但一旦调用 getcontext 的函数返回,它将无法工作。
有没有办法绕过这个限制并在另一个函数(内联宏除外)中调用 getcontext ?
c - 调用 swapcontext() 时出现地址边界错误
我写了一个简单的程序,使用ucontext
库。但是,发生了信号 SIGSEGV(地址边界错误)。运行环境是 MacOS。我不知道我做错了什么?
此处更新:版本 2
正如@Jeremy 建议的那样,我们可以在and上使用static。但是,如果我们换成数组,还是失败了main_context
work_context
work_context
c - 在 ucontext 终止时获取返回值
我正在使用ucontext_t
. 我通过 将线程链接到调度程序线程uc_link
,但是,在某些情况下我们需要获取返回值。我不知道如何获取返回值,因为上下文是分开的。我能想到的访问返回值的唯一方法是以某种方式进入该上下文的堆栈并找到返回值的位置。然而,这似乎是灾难和奇怪错误的公式。
c - 在`ucontext_t`之间切换时是否可以清除所有收到的信号?
我目前有一个ucontext
会阻止 SIGINT,让我们将此上下文称为 A,而我希望其余的上下文在收到 SIGINT 时处理信号。问题是,如果 A 接收到 SIGINT,它确实会阻止它,但是第二个 Isetcontext
会立即调用信号处理程序。当我在进程之间更改时,有没有办法重置信号?
c - 交换上下文后,Ucontext 获得阻塞信号
例如,我SIGINT
在A 中阻止了 a ,假设我在它运行时击中了它,但没有按预期发生。ucontext
^C (SIGINT)
在上下文 B 中,有一个SIGINT
处理程序。当 Iswapcontext(A, B)
然后ucontext
B 立即执行信号处理程序。即使上下文 A 是接收并阻止此信号的那个。有没有办法确保进程 B 不会立即进入信号处理程序?