Проблемы при использовании сопрограмм

grigory.demchenko
grigory.demchenko
void synchronized()
{
    std::unique_lock<async_mutex> lock;
    myAction();
}
4
рейтинг
1 комментарий
yndx-antoshkka
Обсудили голосом, заметки чтобы мне не забыть что к чему:

Со stackfull корутинами можно написать код

void synchronized()
{
schedule lock(writer_thread); // перескакиваем в специальный поток writer_thread
myAction1(); // выполнится в потоке writer_thread
myAction2(); // выполнится в потоке writer_thread
// ~ schedule вернёт нас в изначальный поток
}

со stackless корутинами, так не получится, так как все корутинные методы должны возвращать future. Ближайший аналог

future_t<void> synchronized()
{
try {
schedule lock(writer_thread); // через thread_local выставляем что надо выполняться в writer_thread
co_yield; // считываем thread_local и перескакиваем в поток writer_thread
myAction1(); // выполнится в потоке writer_thread
myAction2(); // выполнится в потоке writer_thread
// ~ schedule через thread_local выставляем что надо выполняться в изначальном потоке
} catch (...) {}
co_yield; // считываем thread_local и перескакиваем в изначальный поток
}

При этом возникают проблемы с thread_local, так как мы можем проснуться в другом потоке - необходимо дополнительно сбрасывать thread_local в дефолт при co_yield

Дополнительные проблемы:
* можно забыть позвать co_yeild
* второй co_yeld может не выполниться в случае исключения если забыть написать try{} catch(...)
* асинхронно создать базовый класса - невозможно
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).