问题标签 [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.

0 投票
1 回答
2083 浏览

c++ - 根据 getcontext 和 setcontext 实现 swapcontext

如果我的理解是正确的,swapcontext相当于先在oucp上调用getcontext,然后在ucp上调用setcontext。我想看看如何使用 getcontext 和 setcontext 实现 swapcontext。

问题是oucp的上下文在错误的行,我想以一种方式调用getcontext,使得下一行是setcontext(ucp)之后的行。但是, setcontext 没有返回,所以我不能这样做。此外,如果我以这种方式实现 swapcontext,如果我将相同的参数传递给 oucp 和 ucp,我将被卡住。

如何使用这两个函数实现 swapcontext?还是不可能?

0 投票
1 回答
4947 浏览

c - getcontext 系统调用 (ucontext.h) 究竟做了什么?

我去年学习了操作系统,在此期间,我使用用户上下文(在标题中定义ucontext.h)为项目实现线程调度程序(其中每个线程模拟一个进程)。我正在参加一个讲座,将讨论用户上下文,我突然想到,尽管去年完成了这个项目,但我并不真正了解getcontext系统调用究竟做了什么。

手册getcontext声明它

将 ucp 指向的结构初始化为当前活动的上下文。"

它还指出,对于 的论点setcontext,如果 ucp 论点

通过调用 getcontext() 获得,程序继续执行,就好像这个调用刚刚返回一样。

好的,所以我明白了。

所以这就是我感到困惑的地方。通常,按照我的学习方式,要执行上下文切换,需要初始化ucontext_t结构并将其交换/设置为:

getcontext如果我在较小的程序中省略,不会发生任何有趣的事情。在通过用户上下文进行更多上下文切换的较大程序中,我遇到了分段错误,只能通过重新添加getcontext来解决。

具体是getcontext做什么的?为什么我不能只分配一个ucontext_t结构,通过初始化uc_stackand字段来初始化它,然后在没有 ? 的情况下uc_sigmask调用?是否有一些必要的初始化执行但不执行?makecontextgetcontextgetcontextmakecontext

0 投票
1 回答
636 浏览

c - 实现用户级线程库但代码不断出现段错误,有什么想法吗?

所以正如标题所说,不幸的是,我的代码一直出现段错误。我很确定我正确地对所有内容进行了 malloc,并且我相信我的函数对于我拥有的测试用例是正确的,但它仍然存在段错误。我只是想看看是否有人可以发现为什么它可能是段错误?这是我到目前为止的代码:

测试用例

瓦尔格林结果:

0 投票
2 回答
3568 浏览

c - linux 上不再定义类型“stack_t”了吗?

linux平台是Ubuntu 12.04

我的源代码中包含以下标头:

但是,当我编译它时,它会抱怨/usr/include/x86_64-linux-gnu/sys/ucontext.h:139:5: error: unknown type name 'stack_t'

我用谷歌搜索,发现stack_t应该在 中定义signal.h,但这里似乎没有定义?

0 投票
1 回答
15967 浏览

c - 上下文切换 - ucontext_t 和 makecontext()

我正在研究 C 编程中的上下文切换,并在 Internet 上找到了以下示例代码。我试图弄清楚是否只有makecontext()函数才能触发执行某些操作的函数。其他函数如setcontext()getcontext()swapcontext()用于设置上下文。

makecontext()函数及其参数附加到上下文,该函数是否始终坚持上下文,直到对其提交更改?

0 投票
2 回答
7950 浏览

c - 在 semaphore.h 和 ucontext.h 中找不到此类文件

我在这里有我的代码:

当我尝试构建我得到的项目时Error 1 error C1083: Cannot open include file: 'ucontext.h': No such file or directory(以及 semaphore.h)。

为什么是这样?我如何解决它?这与我有一台 Windows 机器有关吗?

谢谢!

0 投票
3 回答
3323 浏览

c - 警告:“noreturn”函数确实返回

我正在做一个线程库(使用 uncontext.h 更改上下文)。我的函数是 void 类型,我无法返回。但是即使我不返回,编译时也会出现这个警告:

这是函数的简化代码(没有一些细节):

请注意,我不会随时返回。但是 gcc 给了我这个警告。有谁知道是什么问题?

0 投票
1 回答
379 浏览

c - C/多线程/分段错误/(可能是)线程队列问题

我正在尝试创建线程库。为此,我正在尝试实现队列来存储要执行的待处理线程。

我之所以提到队列,是因为我尝试通过从“MyThreadYield”函数中删除下面的代码来进行试验,它工作正常,但没有达到预期的功能。
getcontext(&(save.context)); 添加队列(保存);

0 投票
2 回答
2797 浏览

c - valgrind 错误和 ucontext。为什么“使用大小为 8 的未初始化值”?

我一直在试图理解为什么 valgrind 抱怨这个使用 ucontexts 的小型测试程序“使用大小为 8 的未初始化值”。它基本上是一个创建“n_ucs”ucontexts 并在“max_switch”时间内切换它们的程序。

我了解“警告:客户端切换堆栈?” (这基本上是程序的全部内容),但我无法理解所有“使用大小为 8 的未初始化值”

如果 Valgrind 错误是误报,或者该程序是否存在根本性错误,我想获得一些帮助。(我在使用相同机制的更大程序上看到了很多,但我已将其提炼到最低限度,以便在此处发布)。

任何帮助表示赞赏。

谢谢,

杰克

使用gcc main.c编译并使用./a.out 2 2运行

gcc -v

使用内置规范。COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper 目标:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion='Ubuntu 4.8 .2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj -c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads =posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable -libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable- java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4。

ldd --版本

ldd (Ubuntu EGLIBC 2.19-0ubuntu6.3) 2.19 版权所有 (C) 2014 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。由 Roland McGrath 和 Ulrich Drepper 撰写。

0 投票
1 回答
408 浏览

linux - 为什么getcontext和setjmp在glibc-x86-64中保存不同的寄存器

以下是他们的源代码: https ://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/unix/sysv/linux/x86_64/getcontext.S;hb= HEAD https:// sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/setjmp.S;hb=HEAD

如您所见,getcontext 还保存了浮点上下文和寄存器 r8 和 r9,而 setjmp 没有。这是什么原因?