Re[30]: cppcms
От: artelk  
Дата: 24.09.14 07:16
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее.

EP>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.

Стэк целиком копируется при переходе в другой поток?
Re[31]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 07:22
Оценка:
Здравствуйте, artelk, Вы писали:

EP>>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее.

EP>>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.
A>Стэк целиком копируется при переходе в другой поток?

Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.
Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
Отредактировано 24.09.2014 7:23 Evgeny.Panasyuk . Предыдущая версия .
Re[32]: cppcms
От: artelk  
Дата: 24.09.14 07:34
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, artelk, Вы писали:


EP>>>Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее.

EP>>>Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.
A>>Стэк целиком копируется при переходе в другой поток?

EP>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.

EP>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.

Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
Re[33]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 07:47
Оценка: 1 (1)
Здравствуйте, 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
     }
}


Регистр указателя стэка подменяется в любом из этих случаев.
Отредактировано 24.09.2014 7:51 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 24.09.2014 7:50 Evgeny.Panasyuk . Предыдущая версия .
Re[31]: cppcms
От: Ночной Смотрящий Россия  
Дата: 24.09.14 07:52
Оценка:
Здравствуйте, Sheridan, Вы писали:

НС>>1.5Гб нерукопожатно.

S>Выкладывай куда нибудь в файлообменник, мне в почту не пролезет

Поднять у себя HTTP или FTP сервер никак?
Re[34]: cppcms
От: artelk  
Дата: 24.09.14 08:05
Оценка:
Здравствуйте, 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 в другом стэке
}
Re[35]: cppcms
От: Ночной Смотрящий Россия  
Дата: 24.09.14 08:09
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Только что у тебя было user.FirstName и внезапно остался только string с именем?


Именно так.

S>Только что GetUsers у тебя принимало параметром чтототам и внезапно оно принимает коннект к БД?


Верно. Это называется цитирование кода.

НС>>Нет, я у тебя о сроках спрашиваю. Что то у тебя парсинг русского барахлит.

S>То есть ты другой тип начальника — требуешь чтобы я сам себе сроки поставил?

Чини парсер. Я ничего не требую, я задаю вопрос, на который ожидаю ответ.
Re[34]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 08:13
Оценка:
A>>Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
EP>Регистр указателя стэка подменяется в любом из этих случаев.

Кстати, если же не заменять stack pointer, а просто продолжать увеличивать стэк вниз, то это и не корутина получается, а что-то типа Continuation Passing Style:
LIVE DEMO
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <vector>

template<typename Range, typename F>
F for_each_jagged(Range &r, F yield)
{
    for(auto &inner : r)
        for(auto &x : inner)
            yield(x);
    return yield;
}

int main()
{
    using namespace std;
    vector<vector<int>> v = {{}, {}, {1,2,3}, {}, {4, 5, 6}, {7,8}, {9}};

    for_each_jagged(v, [](auto x)
    {
        cout << x << " ";
    });
}
// Вывод:
1 2 3 4 5 6 7 8 9


Несмотря на внешнее сходство с корутиной, ею не является. Например, сделать zip, то есть обход нескольких структур по очереди (чередовать элементы) уже не получится. Соответственно решению Same Fringe Problem это тоже не поможет.
Re[23]: cppcms
От: genre Россия  
Дата: 24.09.14 08:14
Оценка:
Здравствуйте, DarthSidius, Вы писали:

DS>Наконец-то понял. Шеридан — это радикальный религозный фанатик C++, Qt и прочей лабуды. Человек живущий в мире иллюзий "о том как действительно надо писать программы" на протяжении многих лет и никто еще не смог поколебать его веру. Аминь!


Да я знаю. Но разве попытка сделать мир лучше не засчитывается в карму? Даже и бессмысленная
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[31]: cppcms
От: genre Россия  
Дата: 24.09.14 08:14
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Это значит, что все что мне говорили ранее, типа "код ничто — запросы к БД и в сеть основной тормоз" — лукавство?

S>Гигабайты конечно никто пока еще не вытаскивает, но вот перелопатить гигабайты в поиске пары строк — вполне себе будет.

Все что тебе говорили ранее верно. Просто ты этого не понимаешь.
Вот тебе простой пример — если логика на стороне БД, например полнотекстовый поиск по огромной базе строк ты упрешся в БД.
Если же этот поиск реализован в коде (это лишь пример, кто хочет обсудить где стоит реализовывать поиск замените поиск на "сложный алгоритм обработки данных") то упрешься в процессор. Причем, внимание, практически независимо от языка на котором написан твой код.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[27]: cppcms
От: genre Россия  
Дата: 24.09.14 08:14
Оценка:
Здравствуйте, artelk, Вы писали:

A>Намного раньше он упрется в количество потоков (при чем, ждущих завершения IO операций 99,9% времени) — т.е. даже вертикального масштабирования нет.

A>Решение: асинхронные IO операции (т.е. IOCP или epoll), что, в случае плюсов, означает взрыв на макаронной фабрике из колбэков.
A>Boost.coroutine не предлагать — оно однопоточное.

ну я так и не понял как же устроен его этот фреймворк, так что в такие дебри не лезу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[28]: cppcms
От: genre Россия  
Дата: 24.09.14 08:14
Оценка:
Здравствуйте, artelk, Вы писали:

A>В тему: http://stackoverflow.com/questions/4257659/c-sharp-versus-c-performance/19505716#19505716 (про 40 разработчиков, 15 лет разработки и 10^6 строк кода).


Да, отличный текст. Шеридан, прочитай его пожалуйста.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[35]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 08:21
Оценка:
Здравствуйте, 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 в другом потоке.
Re[25]: cppcms
От: Ночной Смотрящий Россия  
Дата: 24.09.14 08:28
Оценка:
Здравствуйте, alex_public, Вы писали:

НС>>Вот поэтому для работы с БД и нужно выбирать языки, в которых есть механизмы цитирования кода, а не С++.

_>Какие какие механизмы? )


Цитирования кода. Ты не знаешь что это?
Re[24]: cppcms
От: Ночной Смотрящий Россия  
Дата: 24.09.14 08:28
Оценка:
Здравствуйте, artelk, Вы писали:

A>Гораздо более удобных, чем Linq, реализованный на C++


Таким же извратством как boost lambda? У тебя, как обычно, очень странное представление об удобстве.
Re[36]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 08:30
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

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.
Re[37]: cppcms
От: Ночной Смотрящий Россия  
Дата: 24.09.14 08:34
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Должно быть что-то типа Expression<Func<User, String>>, а не IDbConnection.


Это два разных метода. Так что нет, не должно.
Re[38]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 08:39
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Должно быть что-то типа Expression<Func<User, String>>, а не IDbConnection.

НС>Это два разных метода. Так что нет, не должно.

Если цель запутать, то да, не должно. Если же нет, то можно было написать:
IEnumerable<string> GetUsers_Generated()

хотя бы без IDbConnection, всё равно метод не static.
Отредактировано 24.09.2014 8:40 Evgeny.Panasyuk . Предыдущая версия .
Re[9]: cppcms
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 24.09.14 09:29
Оценка:
Здравствуйте, Хон Гиль Дон, Вы писали:

KV>>Ну, например в C# eval'а нет

ХГД>Ну, если очень надо, то он там есть.

Прямого аналога eval'а из динамических языков в нем нет. А то, как он там может быть сымитирован, сводит количество тех, кто стал бы этим пользоваться в продуктивных приложениях к единицам.

KV>>Так это с моей стороны был сарказм в адрес твоего утверждения о вменяемых разработчиках.

ХГД>Я бы сказал чуть по другому — голословный выпад

Не вижу смысла спорить на тему "я лучше чем ты знаю, что ты этим хотел сказать"

ХГД>Ну то есть тебе неизвестно ни об одном случае взлома нативных приложений через неверный UTF-8


О "неверном UTF-8" говорил ты. Я говорил о недостаточной обработке кодировок. Случаи известны, сплоиты см. ниже.

KV>>написали массу сплоитов для уявзимостей в реальных приложениях: http://www.exploit-db.com/search/?action=search&amp;filter_page=1&amp;filter_description=overflow&amp;filter_exploit_text=unicode&amp;filter_author=&amp;filter_platform=0&amp;filter_type=0&amp;filter_lang_id=0&amp;filter_port=&amp;filter_osvdb=&amp;filter_cve=

ХГД>Кручу-верчу-обмануть хочу — речь шла конкретно о utf-8, а в поиске внезапно просто overflow.

Там о переполнениях, возникающих в результате недостаточной обработки кодировок. А ты тогда вообще о чем?
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[25]: cppcms
От: artelk  
Дата: 24.09.14 09:32
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, artelk, Вы писали:


A>>Гораздо более удобных, чем Linq, реализованный на C++


НС>Таким же извратством как boost lambda? У тебя, как обычно, очень странное представление об удобстве.


Не надо промахиваться с ответом!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.