问题标签 [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.
c - 如何使用 getcontext() 和 setcontext() 进行多线程处理?
如果我理解:多线程允许有多个执行线程。所以在一个线程做某事期间,另一个线程做其他事情而不等待另一个线程。但是当我使用getcontext()和setcontext()时,我的印象是线程等待另一个线程继续执行。你能给我一个如何使用getcontext()和setcontext()来做多线程的例子吗?
c - makecontext 产生无效值?
我的问题涉及这一行:
我的程序在没有赋值操作的情况下编译没有错误,但根本不起作用。这条线似乎什么也没做。当我添加“int f =”时,编译器给了我错误:
我不明白这是怎么回事,因为 ucontext 应该总是返回 0 或 -1。
任何帮助表示赞赏。
c - 为什么 makecontext 没有调用我的函数?
我的程序包含以下行:
其中threadStart()定义为:
我认为这应该导致显示“是!是!5”,但这不会发生。我不确定发生了什么。我知道这条线正在运行,因为我在它下面有一个打印语句。任何帮助表示赞赏。
c - 如何将省略号参数传递给makecontext,它也接受C中的省略号参数?
我有一个运行其他函数的函数,这些函数可以有可变数量的参数。
然后将这个函数的参数传递给makecontext
,它将函数附加到一个ucontext_t结构,但问题是这个函数也接受可变数量的参数。
所以我的问题是,鉴于我无法更改makecontext ,我如何将从函数获得的省略号参数传递给makecontext?
c++ - 我如何知道哪个上下文处于活动状态?
有2个问题。1. 我可以找出当前处于活动状态的上下文吗?
2. 我能否以某种方式传入一个 ucontext,从一个函数到另一个函数作为参数。我想做这样的事情:
一般来说,你需要制作一个Manager,其中会有一个队列,你需要找出哪个上下文处于活动状态并将其放在队列的末尾,并将控制权传递给另一个上下文
c - 为线程库实现调度程序
我正在使用makecontext()、getcontext()和swapcontext()在 C 中实现一个线程库。我需要实现一个调度程序,它每 5 毫秒调用一次,以便与另一个线程(循环)切换上下文。我怎样才能实现这个计时器功能?如果我将计时器放在调度程序中,那么在调度程序未运行时将不可能增加时间。有没有办法将计时器与特定进程相关联,无论上下文处于活动状态,该进程都会更新?
c++ - 考虑 makecontext() uc_stack.ss_size 有什么用?
在调用之前makecontext
为什么我们需要设置堆栈大小ss_size
?
我刚刚有一个片段的单元测试用例makecontext/swapcontext
,它失败了SIGSEGV
。发生的事情是堆栈大小太小并且不相关的内存(恰好是一些唯一的指针)被损坏并报告了段错误。所以段错误在这些不相关的指针上,我可能有一些字符串,然后内存损坏就不会被注意到。
我本以为当堆栈大小不够时会SIGSEGV
立即提高,但考虑到上述内存损坏,我得出结论不可能从这里恢复。这让我回到了这个问题,为什么我们需要首先设置堆栈大小,而不是用来发出溢出信号?这有什么用途?ss_size
SIGSEGV
编辑:
好吧,这都是关于makecontext(3)的。这些函数仍在用于绿色线程、协程等。考虑到这些任务(在我看来)也不是在 c++ 中,它们没有真正的替代品。
ss_size
在getcontext(3)中定义需要在sigaltstack(2)中定义。uc_stack
ucontext_t
按照上面描述的通过“绘制”内存来显示内存损坏的最小可验证示例。
我再次不明白为什么我们需要设置堆栈大小ss_size
,因为看起来它没有被用来防止内存损坏或其他任何事情。看起来它只是在那里,但没有任何用处。但我不敢相信它没有用。那么它“守护”/有什么用呢?
好吧,我不想给这件事带来更多的混乱。目标是通过安装信号处理程序来恢复,从而摆脱固定大小的函数调用堆栈SIGSEGV
,但由于内存损坏,这看起来像是不可能完成的任务;或者有一个可增长的堆栈,例如使用带有标志的mmap(2)MAP_GROWSDOWN
,但这看起来很糟糕,因此不是一个选项。
c - 如何检查上下文是否已完成并继续到 uc_link?
我在 C 中设置了一个调度程序,并经常使用 setcontext 和 swapcontext。
我正在为一个函数设置上下文并使用计时器切换到其他函数,但我不知道如何检查该函数是否已完成并已进入 uc_link。
代码太长而且它是一个库,所以它不完整,所以这里是它应该做什么的伪代码
c - 如果传入的函数有参数,我如何屏蔽来自 makecontext 的警告?
当使用 C 中的函数 ,makecontext
时<ucontext_t.h>
,它需要参数(ucontext_t* context, void (*someFunction)(void), int numberOfArguments, ...)
。numberOfArguments
是将参数传递给,someFunction
但是在传递参数时,我会收到编译警告。
我需要或应该删除这些,因为这是针对学校项目的,警告可能会让我丢分。我想我可以编辑 Makefile 的标志,但我更愿意调整代码。
我做了2次测试。
1:传递一个函数和字符串作为参数
test1 的代码是:
我对 test1 的输出是:
2 : 传递一个 int 作为参数
test2 的代码是:
我对 test2 的输出是:
c - 退出线程并返回
我有一个小问题,我希望找到可以提供帮助的人。我正在尝试使用 ucontext 在 c 中开发一个线程库,并且我已经为此开发了基本功能。所以现在我的问题是我想考虑当用户用 return 而不是我的 exit 函数完成他的函数时的情况。
是否可以知道线程上下文是否完成并在用户在其函数中使用 retutn 时获取返回值?