Тема: Асинхронна функція

Як написати свою асинхронну функцію без створення нового потоку?

2

Re: Асинхронна функція

Асинхронність та багатопотоковість це різні речі. Асинхронна функція пишеться так само, як і синхронна, але викликається вона після настання певної події (наприклад - закінчення процесу запису в файл).

Re: Асинхронна функція

А як виглядає ця функція?
Я щось начитав про 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...

Re: Асинхронна функція

Чи це взагалі не так робиться?

5

Re: Асинхронна функція

Львовский сырник в мульти написав:

Як написати свою асинхронну функцію без створення нового потоку?

За допомогою ключових слів co_await, co_return та co_yield.

6

Re: Асинхронна функція

Львовский сырник в мульти написав:

Чи це взагалі не так робиться?

Не так. Чи не зовсім так.
Потоки ніхто не скасовував. Ви не можете мати один потік виконання і виконувати різні дії одночасно; все одно в якомусь місці вам доведеться перемикатися між різними групами операцій. Зате це перемикання можна зробити більш ефективним і логічним. Тобто, так само як із потоками доводиться десь робити join, щоб дочекатися завершення, так і з асинхронною функцією - доводиться десь робити std::future::wait чи аналог, який і довикличе ту функцію.

Re: Асинхронна функція

Так в boost-і всі асинхронні функції реалізовані як Ви написали, і можна не паритись як воно там внутрішньо працює?

8

Re: Асинхронна функція

Львовский сырник в мульти написав:

можна не паритись як воно там внутрішньо працює?

Для цього, власне, і придумали бібліотеки.
Але в останніх версіях C++ (починаючи з C++11) є свої асинхронні примітиви. Не варто використовувати boost там, де можна обійтися STL.

Подякували: leofun011

9

Re: Асинхронна функція

koala написав:

За допомогою ключових слів co_await, co_return та co_yield.

Не зтикався з ними. А вже є компілятори, які їх підтримують ?

10 Востаннє редагувалося koala (02.06.2021 06:49:11)

Re: Асинхронна функція

Так, усі основні. Хоча clang позначений жовтим, щось ще недоробили. Це зветься співпрограми, coroutines.

А взагалі розвиток C++ зараз виглядає приблизно так.
Розробники якоїсь екзотичної мови: ми придумали новий оператор @#, який робить те і те.
Розробники кількох інших напівекзотичних мов: ми придумали, як додати 2-3 нових ключових слова, щоб це зробити в наших мовах.
Розробники boost: ми придумали, як запхати це в C++. Треба додати п'ять інклюдів, проголосити чотири ДУЖЕ_ДОВГИХ_МАКРОСИ, кожен виклик виглядає як три::простори::імен::чотири_слова_через_підкреслення<і,ще,декілька,параметрів<вкладених>,шаблонів>, і на більшості компіляторів викликає два десятки попереджень. А, так, і якщо ви десь помилитеся - там не буде помилки компіляції, там буде UB раз на тисячу запусків, щасливого дебагінгу!
Розробники стандарту (за 10 років потому): ми придумали, як це додати в стандарт на базі boost. Інклюд потрібен буде один, попередження треба прибрати, ми перевизначаємо 2 застарілих ключових слова, тому в викликах буде на один простір імен і на один параметр шаблону менше, і завдяки оптимізації ймовірність UB при помилці зростає до 1 на 100, ми піклуємося про програмістів!

Подякували: Arete, leofun012