根据getcontext和setcontext实现交换上下文
Implementing swapcontext in terms of getcontext and setcontext
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
如果我的理解是正确的,交换上下文相当于首先在 oucp 上调用 getcontext,然后在 ucp 上调用 setcontext。我正在尝试了解如何使用 getcontext 和 setcontext 实现交换上下文。
int swapcontext(ucontext_t *oucp, ucontext_t *ucp)
{
getcontext(oucp);
setcontext(ucp);
}
问题是 oucp 的上下文在错误的行,我想以一种方式调用 getcontext,使得下一行是 setcontext(ucp) 之后的行。但是,setcontext 不会返回,所以我不能这样做。此外,如果我以这种方式实现交换上下文,如果我将相同的参数传递给 oucp 和 ucp,我就会卡住。
如何使用这两个函数实现交换上下文?还是不可能?
这里有一种方法可以做到这一点。这个想法是在第一次调用setcontext()
时设置一个布尔变量,以便第二次getcontext()
返回时,您可以跳过setcontext()
调用。
int swapcontext(ucontext_t *oucp, ucontext_t *ucp) {
volatile bool swapped = false;
int result = getcontext(oucp);
if (result == 0 && !swapped) {
swapped = true;
result = setcontext(ucp);
}
return result;
}
复习考试时遇到了这个问题!只是一个在交换回旧上下文时增加计数的想法。
int swapcontext(ucontext_t* old_ucp, ucontext_t* new_ucp) {
volatile int count = 0;
getcontext(old_ucp);
count++;
if (count == 1) {
setcontext(new_ucp);
/* Unsuccessful? return -1 */
return -1;
}
if (count == 2) {
/* The saved context is restored, return 0 */
return 0;
}
}
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- C++嵌套if语句,基本货币交换
- shell排序中的交换和比较
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 通过交换元素使数组相同
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 交换运算符 + 重载会导致无限递归
- 为什么 std::reduce 需要交换性?
- 复制和交换习惯用法与移动操作之间的交互
- C++ - 没有自定义交换功能的移动分配运算符?
- 如何在数组中交换最小和最大的位置?
- 尽管一切看起来都很好,但值不会交换
- 根据getcontext和setcontext实现交换上下文