многопоточность — Как я могу использовать асинхронные функции в C ++?

Я начинающий программист C ++. Как я знаю, операторы будут выполняться построчно, поэтому, если я вызову функцию внутри main, сначала будет выполнено тело вызываемой функции, а затем остальная часть кода …

Как показано в следующем коде:

int main()
{
ABC();
// ...
}

void ABC()
{
// ...
}

Таким образом, выполнение моей текущей программы синхронный,но я хочу чтобы это было асинхронный.

Извините за плохой титул! Я не мог найти лучшего названия для вопроса! Если вы можете отредактировать PLZ.

Спасибо за вашу помощь начинающему программисту, как я: D

1

Решение

Приведите примеры вместо того, чтобы указывать новичку на длинную статью. Предоставленная статья или ссылка могут быть отключены в любое время, поэтому люди могут задать тот же вопрос еще раз.

Async обычно не для начинающих, но, поскольку вы хотите изучить его, вот пример того, как это сделать. Вы можете просто скопировать код и вставить его, а затем запустить его. Изучите код. Они очень хорошо прокомментированы для вас, чтобы понять.
Посмотрите, какой из них лучше всего подходит для вас.

Способ 1:
Требуется C ++ 11

Должен работать на Windows, Mac и Linux *

 #include <iostream>
#include <future> //Import the asynchronous Library

using namespace std;

//The function you want to call asynchronously
void ABC()
{
cout<<"Hello From ABC Function"<<endl;
}

int main()
{
/*Setup **ABC function**, We will call it **MyABCFunction**, but you can call it anything else.
Inside MyABCFunction, we call **sync function** and pass it the name of the **function** we want
to call which is "ABC()". You don't include the "()", just the name "ABC".*/

future<void> MyABCFunction(async(ABC));

//Call ABC function
MyABCFunction.get();//Show message from the Main Function
cout << "Hello From Main Function." <<endl;
return 0;
}

Поскольку вы новичок в C ++, я упомянул, что вы не должны использовать «используя пространство имен std«как это может привести к увеличению программы и другим конфликтам имен.

Давайте исправим это ниже:

    #include <iostream>
#include <future> //Import the asynchronous Library

/*No "using namespace std". Instead, each c++ library function must be begin with "std::"which includes Standard library for the function needed
*/

//The function you want to call asynchronously
void ABC()
{
//std:: before cout and endl
std::cout<<"Hello From ABC Function"<<std::endl;
}

int main()
{
//std:: before future and async
std::future<void> MyABCFunction(std::async(ABC));

//Call ABC function
MyABCFunction.get();

//std:: before cout and endl
std::cout << "Hello From Main Function." <<std::endl;
return 0;
}

Способ 2:

C ++ 11 НЕ требуется

Работает только на Windows (Самый простой и короткий способ сделать это)

#include <iostream> //For text on screen
#include <windows.h>  //Must include the use HANDLE class
#include <process.h>   // needed for _beginthread()

//Function prototype of ABCD function to be called in a thread.
void ABCD(void *param);

int main()
{int val = 0;
HANDLE handle; //Create a handle (Only on Windows OS)

/*Initialize the handle and begin thread. */
/*_beginthread takes the name of the function to be called "ABCD" */
/*_beginthread takes the stack size of the thread 0*/
/*_beginthread takes the parameter to be passed to the "ABCD" which is 0(val) since void ABCD(void *param) takes void which means no parameter*/

handle = (HANDLE) _beginthread( ABCD,0,&val);

/*Do infinite loop on the main function to prove that main and ABCD function are running at the same time*/
while(1)
{
std::cout<<"thread from main function"<<std::endl;
}

//Wait for ACBD to finish before exiting the program
WaitForSingleObject(handle,INFINITE);
return 0;
}

//ABCD function to be called from the thread
void ABCD(void *param)
{
/*Do infinite loop on the main function to prove that ABCD and main function are running at the same time*/
while(1)
{
std::cout<<"thread from ABCD function"<<std::endl;
}
_endthread(); // End thread. Won't be called since we are looping forever in while(1) loop

}

Для получения дополнительной информации о _beginthread

Способ 3:

C ++ 11 НЕ требуется

Стандарт POSIX работает на Windows, Mac и Linux

Мы будем считать от 1 до 10000 в функции ABCD и от 1 до 5000 в основной функции.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

void *ABCD(void *arg)
{

//count from 1 to 10000 from the ABCD function thread
for(int i=1; i<=10000;i++)
{
std::cout<<"thread from ABCD function "<<i<<std::endl;
}
}

int main()
{

pthread_t myPthread;

//Create and call the ABCD function to start counting
pthread_create(&myPthread, NULL, ABCD, NULL);

//count from 1 to 5,000 from the main function thread
for(int i=1; i<=5000;i++){
std::cout<<"thread from main function"<<std::endl;
}
}

Проблема здесь в том, что основная функция заканчивает подсчет первым, потому что она насчитывает до 5000, а основная функция — до 10000. Когда основная функция завершается первой, она завершает всю программу, даже если функция ABCD НЕ выполняет подсчет.
Чтобы решить эту проблему, мы используем pthread_join функция ожидания завершения функции ABCD до завершения нашей программы.

Ниже весь код:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

void *ABCD(void *arg)
{

//count from 1 to 10000 on from ABCD function thread
for(int i=1; i<=10000; i++)
{
std::cout<<"thread from ABCD function "<<i<<std::endl;
}
}

int main()
{

pthread_t myPthread;

//Create and call the ABCD function to start counting
pthread_create(&myPthread, NULL, ABCD, NULL);

//count from 1 to 5,000 on from the main function thread
for(int i=1; i<=5000; i++)
{
std::cout<<"thread from main function"<<std::endl;
}

//Wait for ABCD function to finish before we exit
int a =0;
pthread_join(myPthread, (void **)&a);
}

Я надеюсь, что это поможет всем начинающим с ++. Я предлагаю вам опираться семафор как только вы поймете основы Способ 3 Я предоставил.
Для получения дополнительной информации о pthread_t

2

Другие решения

Если вы используете C ++ 11, вы можете рассмотреть std :: async:

В противном случае вы можете легко:

  • Создать тему

  • Установить таймер

3

По вопросам рекламы [email protected]