Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее. EP>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.
Стэк целиком копируется при переходе в другой поток?
Здравствуйте, artelk, Вы писали:
EP>>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее. EP>>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии. A>Стэк целиком копируется при переходе в другой поток?
Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.
Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, artelk, Вы писали:
EP>>>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее. EP>>>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии. A>>Стэк целиком копируется при переходе в другой поток?
EP>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель. EP>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
Здравствуйте, artelk, Вы писали:
EP>>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель. EP>>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый. A>Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
Обычно, память под стэк корутины выделяется в куче, и соответственно она может пережить создавший её поток (как это показано в примере выше).
А вообще, память под стэк корутины можно выделить и в стэке создающего потока, но тогда нужно следить за тем чтобы стэк корутины пережил её выполнение. Схематично:
{
char stack_for_coroutine[1u << 20]; // created on stack
{
Coroutine coro( use_this_buffer_as_stack(stack_for_coroutine) );
// do job
// end of coroutine execution
}
}
Регистр указателя стэка подменяется в любом из этих случаев.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, artelk, Вы писали:
EP>>>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель. EP>>>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый. A>>Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
EP>Обычно, память под стэк корутины выделяется в куче, и соответственно она может пережить создавший её поток (как это показано в примере выше).
EP>А вообще, память под стэк корутины можно выделить и в стэке создающего потока, но тогда нужно следить за тем чтобы стэк корутины пережил её выполнение. Схематично: EP>
EP>{
EP> char stack_for_coroutine[1u << 20]; // created on stack
EP> {
EP> Coroutine coro( use_this_buffer_as_stack(stack_for_coroutine) );
EP> // do job
EP> // end of coroutine execution
EP> }
EP>}
EP>
EP>Регистр указателя стэка подменяется в любом из этих случаев.
Если в куче, то, например, трогать то, что выше по стэку череповато?
void DoStuff(int x)
{
Coroutine coro;//переключились на стэк в куче
//...
DoSomeOperation(x);// упс, x в другом стэке
}
Здравствуйте, Sheridan, Вы писали:
S>Только что у тебя было user.FirstName и внезапно остался только string с именем?
Именно так.
S>Только что GetUsers у тебя принимало параметром чтототам и внезапно оно принимает коннект к БД?
Верно. Это называется цитирование кода.
НС>>Нет, я у тебя о сроках спрашиваю. Что то у тебя парсинг русского барахлит. S>То есть ты другой тип начальника — требуешь чтобы я сам себе сроки поставил?
Чини парсер. Я ничего не требую, я задаю вопрос, на который ожидаю ответ.
A>>Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда? EP>Регистр указателя стэка подменяется в любом из этих случаев.
Кстати, если же не заменять stack pointer, а просто продолжать увеличивать стэк вниз, то это и не корутина получается, а что-то типа Continuation Passing Style: LIVE DEMO
Несмотря на внешнее сходство с корутиной, ею не является. Например, сделать zip, то есть обход нескольких структур по очереди (чередовать элементы) уже не получится. Соответственно решению Same Fringe Problem это тоже не поможет.
Здравствуйте, DarthSidius, Вы писали:
DS>Наконец-то понял. Шеридан — это радикальный религозный фанатик C++, Qt и прочей лабуды. Человек живущий в мире иллюзий "о том как действительно надо писать программы" на протяжении многих лет и никто еще не смог поколебать его веру. Аминь!
Да я знаю. Но разве попытка сделать мир лучше не засчитывается в карму? Даже и бессмысленная
Здравствуйте, Sheridan, Вы писали:
S>Это значит, что все что мне говорили ранее, типа "код ничто — запросы к БД и в сеть основной тормоз" — лукавство? S>Гигабайты конечно никто пока еще не вытаскивает, но вот перелопатить гигабайты в поиске пары строк — вполне себе будет.
Все что тебе говорили ранее верно. Просто ты этого не понимаешь.
Вот тебе простой пример — если логика на стороне БД, например полнотекстовый поиск по огромной базе строк ты упрешся в БД.
Если же этот поиск реализован в коде (это лишь пример, кто хочет обсудить где стоит реализовывать поиск замените поиск на "сложный алгоритм обработки данных") то упрешься в процессор. Причем, внимание, практически независимо от языка на котором написан твой код.
Здравствуйте, artelk, Вы писали:
A>Намного раньше он упрется в количество потоков (при чем, ждущих завершения IO операций 99,9% времени) — т.е. даже вертикального масштабирования нет. A>Решение: асинхронные IO операции (т.е. IOCP или epoll), что, в случае плюсов, означает взрыв на макаронной фабрике из колбэков. A>Boost.coroutine не предлагать — оно однопоточное.
ну я так и не понял как же устроен его этот фреймворк, так что в такие дебри не лезу.
Здравствуйте, artelk, Вы писали:
A>Если в куче, то, например, трогать то, что выше по стэку череповато? A>void DoStuff(int x) A>{ A> Coroutine coro;//переключились на стэк в куче A> //... A> DoSomeOperation(x);// упс, x в другом стэке A>}
Если DoSomeOperation принимает x как ссылку И может пережить выполнение DoStuff — то да, правильно, это повлечёт проблемы. Тем не менее, использовать stackful coroutines для "выпрямления" асинхронного кода это никак не мешает.
В C#, кстати, тоже возможна подобная ситуация — например какой-нибудь ресурс, типа файла, привязан к некоторому scope, через using, и в этом scope запускается async метод который работает с этим файлом, причём переживает вызвавший его scope в другом потоке.
Здравствуйте, alex_public, Вы писали:
НС>>Вот поэтому для работы с БД и нужно выбирать языки, в которых есть механизмы цитирования кода, а не С++. _>Какие какие механизмы? )
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Только что GetUsers у тебя принимало параметром чтототам и внезапно оно принимает коннект к БД? НС>Верно. Это называется цитирование кода.
Конкретно это называется опечаткой/опиской:
var str = GetUsers(user => "<div><span>" + user.FirstName + "</span><span>" + user.LastName + "</span></div>").Join();
// vs
IEnumerable<string> GetUsers(IDbConnection con)
Должно быть что-то типа Expression<Func<User, String>>, а не IDbConnection.
Здравствуйте, Ночной Смотрящий, Вы писали:
EP>>Должно быть что-то типа Expression<Func<User, String>>, а не IDbConnection. НС>Это два разных метода. Так что нет, не должно.
Если цель запутать, то да, не должно. Если же нет, то можно было написать:
IEnumerable<string> GetUsers_Generated()
хотя бы без IDbConnection, всё равно метод не static.
Здравствуйте, Хон Гиль Дон, Вы писали:
KV>>Ну, например в C# eval'а нет ХГД>Ну, если очень надо, то он там есть.
Прямого аналога eval'а из динамических языков в нем нет. А то, как он там может быть сымитирован, сводит количество тех, кто стал бы этим пользоваться в продуктивных приложениях к единицам.
KV>>Так это с моей стороны был сарказм в адрес твоего утверждения о вменяемых разработчиках. ХГД>Я бы сказал чуть по другому — голословный выпад
Не вижу смысла спорить на тему "я лучше чем ты знаю, что ты этим хотел сказать"
ХГД>Ну то есть тебе неизвестно ни об одном случае взлома нативных приложений через неверный UTF-8
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, artelk, Вы писали:
A>>Гораздо более удобных, чем Linq, реализованный на C++
НС>Таким же извратством как boost lambda? У тебя, как обычно, очень странное представление об удобстве.