Re: Generators in C++, (a.k.a. foreach & iteartors)
От: remark Россия http://www.1024cores.net/
Дата: 26.05.08 23:49
Оценка:
Здравствуйте, 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/



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.