Реализация системного стека без переполнения в C90

Я только что читал о том, как Google Go по умолчанию делает каждый поток с уменьшенным размером стека, а затем ссылается на новые стеки, если произойдет переполнение (см. Стр. 16 в здесь ). Мне было интересно, как лучше всего это сделать в C.

Я должен сказать, что я не эксперт по C, поэтому может быть лучший способ обнаружить переполнение стека на C, но, учитывая мое незнание, здесь ' Как я думал, что смогу это реализовать:

Первое, о чем я подумал, это то, что каждый раз, когда у нас есть новый новый стек, мы получаем адрес переменной стека, а вместе с ним и примерно начальный адрес стека. Тогда нам нужно будет получить, сколько места в стеке есть у потока. Это было бы возможно, если бы поток не был основным потоком, но я понятия не имею, как мы можем получить эту информацию на C.

Затем нам нужно будет проверить (для каждого вызова функции, это может быть), сколько из стек уже используется, получая текущий адрес переменной стека. Если мы обнаружим возможное переполнение стека, нам нужно будет каким-то образом создать новый стек и связать его с последним. Единственный способ, которым я думал, что это может быть сделано в C, - это создать новый поток для выполнения нужной нам функции и заблокировать текущий поток до тех пор, пока функция не вернет свой результат.

Итак, есть ли более чистый / лучший способ реализовать это?

8
задан Deduplicator 27 November 2019 в 03:42
поделиться