1
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);

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

int swapcontext(ucontext_t *oucp, ucontext_t *ucp)  
{  
    getcontext(oucp);  
    setcontext(ucp);  
}

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

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

4

1 回答 1

3

这是一种方法。思路是在第一次调用时设置一个布尔变量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;
}
于 2013-10-22T16:42:25.537 回答