Я думаю, что обернуть поток в объект — идея полностью оправдана, совершенно естественно связать поток с его контестом и всеми данными в одном объекте и при этом спрятать всё лишнее от планировщика, оверхед если и будет, то совсем незначительный.
Причина того, что это сделано на C — то, что такой подход более общий, еще существуют микроконтроллеры, для которых нет компилятора C++, или он очень дорог, или нужно поддерживать уже существующий проект на С
Да, всё правильно, если нужно запустить один поток из другого потока, или нужно запустить несколько одинаковых потоков, контекст нужно хранить и передавать явно, например в структуре. Обычные функции можно вызывать обычным способом, их никто не прервёт до завершения. Если потоков переменное количество, удобно объединить контекст потока с его функцией в структуру и вести список таких структур. Тут простор для творчества большой :)
А, понял вопрос! Да, в данном конкретном случае можно написать fib(&pt1, 1000, &value) != PT_ENDED или fib(&pt1, 1000, &value) == PT_YIELDED, < PT_EXITED более общая проверка на завершение
Спасибо. Там несколько констант, означающих причину выхода, те что < PT_EXITED означают то, что поток еще не окончен, ждет чего-то или вернул промежуточное значение, > PT_EXITED значит, что поток прерван или дошел до конца
Причина того, что это сделано на C — то, что такой подход более общий, еще существуют микроконтроллеры, для которых нет компилятора C++, или он очень дорог, или нужно поддерживать уже существующий проект на С