Здравствуйте, c-smile, Вы писали:
CS>Используя идею "coroutines in C" Simon Tatham вот родилось следующее решение для C++.
Очень занятно. Сам не так давно думал над подобным, но почему-то опрометчиво раньше времени подумал, что в С++ с таким подходом ничего хорошего не выйдет. Тем не менее пока все попытки "сломать" этот код успехом не увенчались. Как минимум выдается варнинг. Пробовал вставлять определение локальной переменной с инициализацией, без инициализации, break.
Кстати, если есть цикл и внутри него ветка case и стоит break, это определено, что break будет относиться к циклу, а не к case?
Кто-нибудь может это сломать???
Что бы не было даже варнинга на самом высоком уровне предупреждений.
Собственно а подумал я, что ничего хорошего не выйдет, т.к. 3 известные мне реализации yield() в С/С++ все страдают серьезными проблемами.
Первая — это в Cilk. Но там используется специальный препроцессор, который генерирует код для запоминания/восстановления стековых переменных. Работает соотв. только для С.
http://supertech.csail.mit.edu/papers/cilk5.pdf
На Figure 3 видно, какой код генерирует препроцессор. Помимо запоминая PC (_line), так же запоминаются все локальные переменные.
Вторая — это в библиотеке Сapriccio. Но там они пытаются делать нереальный анализ потребления стека функциями и в итоге делают честную подмену/восстановление стека.
http://capriccio.cs.berkeley.edu/pubs/capriccio-sosp-2003.pdf
Третья — это в библиотеке Protothreads. Там они честно говорят, что потоки бесстековые, т.е. если хотите локальные переменные — перерассчитывайте их заново после каждого yield(). Реализация, кстати, по-ходу практически один в один с этой.
http://www.sics.se/~adam/pt/