问题标签 [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 - 实现用户级线程库 - 从 makecontext 返回值
我在用户线程库上看到了一些问题,但似乎没有一个可以回答我的问题。我能够创建线程、运行它们、取消它们并退出它们。由于某种原因,我不能做的是让线程返回数据。
当我初始化我的线程库时,我设置我的退出线程上下文如下:
我创建一个线程并将其分配如下:
当函数返回并调用 thread_exit()时:
打印输出始终为“返回值:0”
被调用的函数返回一个指向整数的指针。
我究竟做错了什么?
c - pthread上的clang错误与Mac上的ucontext
我正在ucontext
与pthread
. 以下程序在 Linux 上运行正常,但在 Mac 上断言失败。
问题似乎是从另一个线程恢复上下文后未正确访问线程局部变量。
该程序创建了两个线程,A 和 B。A 在 B 可以恢复上下文之前将上下文设置好,因为它已正确同步。
如果有人能对 Mac 上的这种行为有所了解,我们将不胜感激。
环境:
程序:
c - setcontext 中的分段错误
我正在对调度程序如何调度等待线程进行一些测试,在此过程中,我不想让操作系统看到等待线程,所以我杀死了一个正在等待锁的线程并在锁被释放时启动它,我认为我应该在退出之前保存线程的上下文,并在我再次创建它时恢复它。显然我做错了什么,但我无法弄清楚。(我对这个主题很陌生。)
到目前为止,这是我的代码,它会使用 setcontext 生成分段错误。
c - OS X 10.10 上 ucontext makecontext 的分段错误
我使用 gcc 在 OS X 10.10 中运行我的代码。我正在尝试实现一个用户上下文库。
如果我注释掉thread_create( &t2, thr2, NULL);
,代码将产生预期的效果。我不知道为什么与 相关的行t2
会导致t1
.
作者笔记
切换到 Ubuntu 后,我很高兴地致力于实现用户上下文库。一切正常。不再有分段错误。正如预期的那样,它在 OS X 10.10 上崩溃了。
我的猜测是,由于编译器警告说,自 10.6 起,OS X 上不推荐使用 makecontext()、swapcontext() 等,所以我不应该期望它会起作用。
c++ - 为什么 ucontext 有这么高的开销?
Boost v1.59 中 Boost.Context 的文档报告了以下性能比较结果:
我的问题是,为什么ucontext的开销比 Boost 库的实现高 20 倍?我看不出有什么明显的原因为什么会有如此大的差异。Boost 实现是使用了 ucontext 实现者遗漏的一些低级技巧,还是这里发生了其他事情?
c - mac OSX 上使用 ucontext 和信号的用户线程调度 API
我正在设计一种具有以下特性的调度算法:
- 在一个进程中有 2 个用户线程(上下文)(我应该做 3 个线程,但在 osx 上还不行,所以我决定现在让 2 个工作)
- 使用每 1 秒关闭一次的 SIGALRM 信号进行抢先,并将控制从一个上下文更改为另一个,并保存在执行切换之前正在运行的上下文的当前状态(寄存器和当前位置)。
我注意到以下内容:
- ucontext.h 库在 mac osx 上的行为很奇怪,而当它在 Linux 中应用时,它的行为完全符合它的预期(来自此 man 链接的示例:http: //man7.org/linux/man-pages/man3/makecontext .3.html像在 linux 上应该的那样完美地工作,而在 mac 上,它在进行任何交换之前因分段错误而失败)。不幸的是,我必须让它在 osx 而不是 linux 上运行。
- 我设法通过使用 getcontext() & 然后 setcontext() 来交换上下文来解决 osx 上的 swapcontext 错误。
- 在我的信号处理函数中,我使用了 sa_sigaction( int sig, siginfo_t *s, void * cntxt ),因为第三个变量曾经将它重新转换为 ucontext_t 指针,是关于被中断的上下文的信息(这在 Linux 上是正确的)一旦我测试过它)但在mac上它没有指向正确的位置,因为当我使用它时我再次遇到分段错误。
我已经为每个上下文设计了我的测试函数,使其在 while 循环中循环,因为我想中断它们并确保它们返回到该函数中的正确位置执行。我已经定义了一个静态全局计数变量,它可以帮助我查看我是否在正确的用户线程中。
最后一点是,我发现在测试函数中调用 getcontext() 在我的 while 循环中会不断更新我当前上下文的位置,因为它是空的 while 循环,因此当该上下文的时间到来时调用 setcontext()从适当的地方执行。此解决方案是多余的,因为这些功能将从 API 外部提供。
- 我在这里做错了什么?我必须稍微改变一下才能在 Linux 上正确运行它并在 OSX 上运行适用于 Linux 的版本会导致分段错误,但为什么它会在该操作系统上运行而不是这个?
- 这是否与我在每个上下文中分配的堆栈大小有关?
- 我应该为我的信号分配一个堆栈空间吗?(它说如果我不这样做,那么它使用默认堆栈,如果我这样做并没有真正的区别)?
- 如果使用 ucontext 永远不会在 mac osx 上给出可预测的行为,那么在 osx 上实现用户线程的替代方案是什么?我尝试使用 tmrjump 和 longjmp 但我遇到了同样的问题,即当上下文在执行某个函数的过程中被中断时,我如何才能获得该上下文被中断的确切位置以便继续我下一次中断的地方时间?
linux - 如何知道正在运行的上下文是什么
我正在用 C 语言编写一个小程序,它创建一个由三个 ucontext_t 类型的结构组成的数组。该程序使用 swapcontext 命令在这 3 个上下文之间切换。
我的问题是:我是否有能力知道当前运行的上下文的身份?我希望找到一个函数/命令,它给出当前正在运行的上下文的标识符。你知道这样的功能/命令吗?也许有什么方法可以使用调试器来解决这个问题?
多谢!
c++ - 尝试将交换上下文()交换到存储在队列中的结构成员时出现段错误
我已经定义了thread
一个名为ucontext* tctx
.
在一个名为 的函数create_thread()
中,我在堆上创建了一个线程对象并定义了它的每个成员(包括 ucontext 对象的成员)。然后,我将指向该线程对象的指针添加到队列容器中。
当我弹出队列以交换到线程的上下文时,我出现了段错误。我不确定为什么会这样。
这是完整的代码:
编辑:
我注意到如果我在问题解决getcontext(n->tctx);
后打电话。n -> tctx = new ucontext_t;
似乎问题可能在于getcontext
试图初始化堆中尚未分配的东西。
c - 在两个函数上下文的执行之间切换
我正在尝试编写一个程序,其中定义了两个函数,一个打印奇数,另一个打印偶数。程序执行一个函数一定的时间,当它收到警报信号时,它会在保存当前函数的上下文后开始执行第二个函数。当它接收到下一个警报信号时,它会从上次保存的上下文中恢复第一个函数的执行。
为此,我使用了 getcontext 和 swapcontext 函数。
这是我的代码:
我收到的输出是:
为什么每次都恢复上下文但仍然打印函数 nextEven() 的值?
c - 为什么 srand(time(NULL)) 给我主要的分段错误?
在这里需要一些帮助。
我想了解这段代码中发生了什么。
我正在尝试为函数内部创建tickets
的TCP_t
结构生成随机数ccreate
。
问题是,每次我执行这段代码时,srand(time(NULL))
它都会一遍又一遍地返回相同的“随机”数字序列,例如:
所以我用时间播种,生成真正的随机数。
当我将种子放入newTicket
函数中时,它会在每次执行中带来不同的数字,但每个线程的数字相同。这是一个输出示例:
执行1:
执行2:
因此,经过一些研究,我发现我不应该在每次调用时都播种它,rand
而只能在程序开始时播种一次。现在,将种子放入main
函数后,它给了我分段错误,我不知道为什么。
这可能是一个愚蠢的问题,但我真的很想了解发生了什么。
不知何故,种子在搞什么?我错过了什么吗?我应该以另一种方式生成随机数吗?
感谢所有在这里帮助我的人。
如果代码太难看,很抱歉。试图尽可能地简化它。