Как работают swapcontext и getcontext? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть этот код ниже

volatile int done = 0;

int main() {


ucontext_t one;
ucontext_t two;


getcontext(&one);
printf("done = %d\n", done);
if(!done) {
done = 1;
printf(" - gurka -\n");
swapcontext(&two, &one);
printf(" - tomat -\n");
} else {
printf(" - salad -\n");
swapcontext(&one, &two);
printf(" - morot -\n");
}
printf(" - potät -\n");
return 0;
}

Когда он будет выполнен, я получаю это ниже

done = 0
- gurka -
done = 1
- salad -
- tomat -
- potät -

Почему он печатается так, у меня есть эта функция swapcontext () и в на man-страницах написано так, что это сохраняет контекст в другом потоке, я не понимаю, почему это записывается?

1 Ответ

0 голосов
/ 12 апреля 2020

int swapcontext (ucontext_t * oucp, ucontext_t * ucp);

Функция swapcontext() сохраняет текущий контекст в структуре, на которую указывает oucp, а затем активирует контекст, на который указывает ucp.

Слово «Контекст» относится ко всем важным регистрам процессора, которые представляют текущее состояние системы. Список этих регистров зависит от архитектуры вашего компьютера, но наиболее важными являются: указатель стека, счетчик программ, регистр связи (для ARM, PowerP C и PA-RIS C, в котором сохраняется обратный адрес) и т. Д. c , Эти регистры будут сохранены в oucp. Кроме того, будет загружаться из ucp для каждого активирующего контекста, который из-за установки значения P C, возможно, выполняет скачок.

Итак, согласно вашему коду:

1 |volatile int done = 0;
2 |
3 |int main() {
4 |
5 |
6 | ucontext_t one;
7 | ucontext_t two;
8 |
9 |
10| getcontext(&one);
11| printf("done = %d\n", done);
12| if(!done) {
13|     done = 1;
14|     printf(" - gurka -\n");
15|     swapcontext(&two, &one);
16|     printf(" - tomat -\n");
17| } else {
18|     printf(" - salad -\n");
19|     swapcontext(&one, &two);
20|     printf(" - morot -\n");
21| }
22| printf(" - potät -\n");
23| return 0;
24|}

В строке # 15 будет загружен контекст one. Код перейдет к строке # 11.

В строке # 19 будет загружен контекст two. Код переместится на строку # 16.

Обратите внимание, что getcontext просто сохраняет текущий контекст. Вы можете получить более подробную информацию об этих типах функций через Интернет, прибегая к помощи.

...