Тема: Асинхронна функція
Як написати свою асинхронну функцію без створення нового потоку?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Асинхронна функція
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Як написати свою асинхронну функцію без створення нового потоку?
Асинхронність та багатопотоковість це різні речі. Асинхронна функція пишеться так само, як і синхронна, але викликається вона після настання певної події (наприклад - закінчення процесу запису в файл).
А як виглядає ця функція?
Я щось начитав про callback, але функція виконується підчас виклику головної функції,а не після її завершення. Можливо, щось не так зрозумів... Але як це зробити?
#include <iostream>
void foo(int* mas, int size)
{
std::cout <<"C"<< std::endl;
for (int i = 0; i < size; i++)
{
std::cout << mas[i] << " ";
}
std::cout << std::endl;
}
void mainfoo(int* mas, int size, void (*callback)(int*, int))
{
(*callback)(mas, size);
}
int main()
{
int mas[10] = { 1,3,35,6,578,3,1,4,5,6 };
std::cout << "A" << std::endl;
mainfoo(mas, 10, foo);
std::cout << "B" << std::endl;
return 0;
}
Як зробить, щоб вивід був не А,C,123..,B. А щоб був A,B,C,123...
Як написати свою асинхронну функцію без створення нового потоку?
За допомогою ключових слів co_await, co_return та co_yield.
Чи це взагалі не так робиться?
Не так. Чи не зовсім так.
Потоки ніхто не скасовував. Ви не можете мати один потік виконання і виконувати різні дії одночасно; все одно в якомусь місці вам доведеться перемикатися між різними групами операцій. Зате це перемикання можна зробити більш ефективним і логічним. Тобто, так само як із потоками доводиться десь робити join, щоб дочекатися завершення, так і з асинхронною функцією - доводиться десь робити std::future::wait чи аналог, який і довикличе ту функцію.
Так в boost-і всі асинхронні функції реалізовані як Ви написали, і можна не паритись як воно там внутрішньо працює?
можна не паритись як воно там внутрішньо працює?
Для цього, власне, і придумали бібліотеки.
Але в останніх версіях C++ (починаючи з C++11) є свої асинхронні примітиви. Не варто використовувати boost там, де можна обійтися STL.
За допомогою ключових слів co_await, co_return та co_yield.
Не зтикався з ними. А вже є компілятори, які їх підтримують ?
Так, усі основні. Хоча clang позначений жовтим, щось ще недоробили. Це зветься співпрограми, coroutines.
А взагалі розвиток C++ зараз виглядає приблизно так.
Розробники якоїсь екзотичної мови: ми придумали новий оператор @#, який робить те і те.
Розробники кількох інших напівекзотичних мов: ми придумали, як додати 2-3 нових ключових слова, щоб це зробити в наших мовах.
Розробники boost: ми придумали, як запхати це в C++. Треба додати п'ять інклюдів, проголосити чотири ДУЖЕ_ДОВГИХ_МАКРОСИ, кожен виклик виглядає як три::простори::імен::чотири_слова_через_підкреслення<і,ще,декілька,параметрів<вкладених>,шаблонів>, і на більшості компіляторів викликає два десятки попереджень. А, так, і якщо ви десь помилитеся - там не буде помилки компіляції, там буде UB раз на тисячу запусків, щасливого дебагінгу!
Розробники стандарту (за 10 років потому): ми придумали, як це додати в стандарт на базі boost. Інклюд потрібен буде один, попередження треба прибрати, ми перевизначаємо 2 застарілих ключових слова, тому в викликах буде на один простір імен і на один параметр шаблону менше, і завдяки оптимізації ймовірність UB при помилці зростає до 1 на 100, ми піклуємося про програмістів!
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися