Size: a a a

2020 June 08

L

Lee Armstrong in pro.cxx
magras
На сколько я понимаю, если в main_task будет что-то тяжелое исполняться это заблокирует libuv. Именно поэтому я говорил, о том, что так делать не стоит.
Это справедливо для любой тяжелой функции
источник

m

magras in pro.cxx
Lee Armstrong
мне не нужно 2 эвентлупа, у меня он один, и это libuv, а не io_service, который еще не запилили в linux. Ну и не static_thread_pool, который мне вообще не нужен, ибо однопоток. В прочем я уже решил это дело.

Я просто не понимал как это сделать, ибо sync_wait блокирующий, и run эвентлупа блокирующий.
Пришел к решению cppcoro::when_all(main_task(), loop_run())
cppcoro::task<void> main_task() {
 std::cout << "Главный таск начало" << std::endl;
 co_await sleep_for(1s);
 std::cout << "Главный таск конец" << std::endl;
 co_return;
}

cppcoro::task<void> loop_run() {
 uvw::Loop::getDefault()->run();
 co_return;
}

int main() {
 cppcoro::sync_wait(cppcoro::when_all(main_task(), loop_run()));
}
Хотя стоп, это точно работает? Рантайм cppcoro не заблокируется на loop_run()?
источник

m

magras in pro.cxx
По моим представлениям код такого вида должен залочиться:

cppcoro::task<void> main_task() {
 for (;;) {
   std::cout << '.';
   co_await sleep_for(1s);
 }
}

cppcoro::task<void> loop_run() {
 std::this_thread::sleep(60s);
 co_return;
}

int main() {
 cppcoro::sync_wait(cppcoro::when_all(main_task(), loop_run()));
}
источник

DF

Dollar Føølish in pro.cxx
Да, должен
источник

DF

Dollar Føølish in pro.cxx
У тебя тред занят
источник

L

Lee Armstrong in pro.cxx
magras
По моим представлениям код такого вида должен залочиться:

cppcoro::task<void> main_task() {
 for (;;) {
   std::cout << '.';
   co_await sleep_for(1s);
 }
}

cppcoro::task<void> loop_run() {
 std::this_thread::sleep(60s);
 co_return;
}

int main() {
 cppcoro::sync_wait(cppcoro::when_all(main_task(), loop_run()));
}
Так ты замораживаешь поток на 60 сек, а я запускаю эвентлуп который разгребает таски (sleep_for), которые наплодит main_task
А sleep_for это не std::thread::sleep_for, а работа с таймерами из libuv
https://pastebin.com/rHS2HVcS
источник

m

magras in pro.cxx
Lee Armstrong
Так ты замораживаешь поток на 60 сек, а я запускаю эвентлуп который разгребает таски (sleep_for), которые наплодит main_task
А sleep_for это не std::thread::sleep_for, а работа с таймерами из libuv
https://pastebin.com/rHS2HVcS
uvw::Loop::getDefault()->run();

На сколько я понимаю это блокирующий запуск эвент лупа libuv. То есть фактически это и есть std::this_thread::sleep(60s);.
источник

m

magras in pro.cxx
Только нет гарантии что оно закончится через 60 секунд.
источник

DF

Dollar Føølish in pro.cxx
Ну, нет. Луп же блокируется на то штоб разгрести таски
источник

DF

Dollar Føølish in pro.cxx
Корутины
источник

DF

Dollar Føølish in pro.cxx
Хотя я с этой либой не работал, но принцип такой
источник

m

magras in pro.cxx
Dollar Føølish
Ну, нет. Луп же блокируется на то штоб разгрести таски
А linuv умеет работать с корутинами из cppcoro?
источник

DF

Dollar Føølish in pro.cxx
А, вон чо
источник

L

Lee Armstrong in pro.cxx
magras
А linuv умеет работать с корутинами из cppcoro?
не-а, самому костылить надо
источник

L

Lee Armstrong in pro.cxx
magras
А linuv умеет работать с корутинами из cppcoro?
cppcoro::task<void> main_task() {
 for (;;) {
   std::cout << '.';
   std::cout.flush();
   co_await sleep_for(1s);
 }
}
источник

L

Lee Armstrong in pro.cxx
источник

L

Lee Armstrong in pro.cxx
осталось подождать когда какой-нибудь умелец запилит нам cppcoro over libuv ^_^
источник

ЯФ

Ярослав Фриш... in pro.cxx
'''
   std::vector <ULL> primitive [7];
   ULL muv{0};


   result.minus= (operand_one.minus == operand_two.minus) ? operand_one.minus : true;
   for (size_t i = 0   ; i<=7  ; ++i )
   {
       for (size_t iter = 0; iter <operand_one.Var.size(); ++iter)
       {
           cout<<iter<<"\tMin\t"<<i+2<<"\t"<<operand_one.Var[iter]<<"\t";
           muv = (i+2) * operand_one.Var[iter];
           cout<<muv;
           cout<<endl;
           primitive[i].push_back(muv);
       }
       cout<<endl;
   }
   cout<<endl<<endl<<endl;
   for (size_t i = 0   ; i<=7  ; ++i )
   {
       cout<<i+2<<"\t";
       for (const auto& n: primitive[i])
       {
           cout<<n<<" ";
       }
       cout<<endl;
   }
   cout<<endl<<endl<<endl;
   '''
источник

ЯФ

Ярослав Фриш... in pro.cxx
Вопрос почему в  for (const auto& n: primitive[i]) на 7 итераций я получаю Segmentation fault
источник

ЯФ

Ярослав Фриш... in pro.cxx
При этом в первом цикле всё нормально
источник