Я начинающий программист C ++. Как я знаю, операторы будут выполняться построчно, поэтому, если я вызову функцию внутри main, сначала будет выполнено тело вызываемой функции, а затем остальная часть кода …
Как показано в следующем коде:
int main()
{
ABC();
// ...
}
void ABC()
{
// ...
}
Таким образом, выполнение моей текущей программы синхронный,но я хочу чтобы это было асинхронный.
Извините за плохой титул! Я не мог найти лучшего названия для вопроса! Если вы можете отредактировать PLZ.
Спасибо за вашу помощь начинающему программисту, как я: D
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
Если вы используете C ++ 11, вы можете рассмотреть std :: async:
В противном случае вы можете легко:
Создать тему
Установить таймер