标签: user-thread

有什么东西可以替换<ucontext.h>函数吗?

<ucontext.h>不推荐使用用户线程函数,因为它们使用不推荐的C 函数(它们使用带有空括号的函数声明作为参数).

它们有标准替代品吗?我不认为成熟的线程擅长实现协作线程.

c posix user-thread

22
推荐指数
3
解决办法
7325
查看次数

使用 ucontext 和信号的 mac OSX 上的用户线程调度 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 循环内循环,因为我想中断它们并确保它们返回到该函数内的适当位置执行。我已经定义了一个静态全局计数变量,它可以帮助我查看我是否在正确的用户线程中。

最后一个注意事项是,我发现在我的 while 循环中调用 getcontext() 并在测试函数中不断更新我当前上下文的位置,因为它是空的 while 循环,因此在该上下文的时间到来时调用 setcontext() 使得它从适当的地方执行。此解决方案是多余的,因为这些功能将从 API 外部提供。

    #include <stdio.h> …
Run Code Online (Sandbox Code Playgroud)

c scheduler user-thread ucontext osx-yosemite

4
推荐指数
1
解决办法
1245
查看次数

标签 统计

c ×2

user-thread ×2

osx-yosemite ×1

posix ×1

scheduler ×1

ucontext ×1