getcontext
可以多次返回。例如,我绘制了一个类似于此处演示的 C 程序:
#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <ucontext.h>
struct communication {
const ucontext_t *return_ctx;
int return_value;
};
static void
test(ucontext_t *thisctx, struct communication *comm)
{
int i = 0;
assert(getcontext(thisctx) == 0);
// getcontext will return 3 times with i having different values
comm->return_value = ++i;
setcontext(comm->return_ctx);
assert(0);
}
int
main(void)
{
ucontext_t mainctx, testctx;
struct communication comm;
char test_stack[SIGSTKSZ];
assert(getcontext(&testctx) == 0);
testctx.uc_stack.ss_sp = test_stack;
testctx.uc_stack.ss_size = sizeof test_stack;
makecontext(&testctx, test, 2,
&testctx, &comm);
for (int i = 0; i < 3; ++i) {
// Rewind test's execution where 'getcontext' returns
comm.return_ctx = &mainctx;
assert(swapcontext(&mainctx, &testctx) == 0);
assert(printf("%d\n", comm.return_value) > 0);
}
return 0;
}
编译并运行它
$ gcc -std=gnu99 -O3 -o getcontext_test getcontext_test.c
$ ./getcontext_test
1
1
1
没有给出预期1 2 3
,因为编译器认为只有在分配给时i
才能相等。1
comm->return_value
我可以通过定义i
volatile
来解决这个问题,但是我想要一个更规范的方法来解决这个问题。