Я пробую свои силы в асинхронных вызовах функций в C ++ с использованием std::async
в соответствии с этим официальным cplusplus.com примером кода.
К сожалению, компиляция не удалась.При запуске mingw32-make
я получаю следующие ошибки:
Я также попытался запустить make
через WSL (Подсистема Windows для Linux), что по сути делает Linux bash доступным в Windows.Там тоже не работает:
main.o: In function `std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<bool (*)(int), long> >, bool>::_Async_state_impl(std::thread::_Invoker<std::tuple<bool (*)(int), long> >&&)::{lambda()#1}&&)':
/usr/include/c++/7/thread:122: undefined reference to `pthread_create'
Я пробовал следующее:
Обновление моего компилятора с использованием этого SO ответа .
Как отмечалось выше, попытка сделать, используя два разных подхода.Оба сбоя.
Использование gcc
вместо g++
(просто другой компилятор).
Вот main.cpp
:
#include <iostream>
#include <string>
#include <cstdlib>
#include <future>
// a non-optimized way of checking for prime numbers
bool is_prime (int x)
{
std::cout << "Calculating. Please, wait..." << std::endl;
for (int i=2; i<x; ++i)
{
if(x % i == 0) return false;
}
return true;
}
void interpret_result (bool result)
{
if (result)
{
std::cout << "It is prime!" << std::endl;
}
else
{
std::cout << "It is not prime!" << std::endl;
}
}
int main()
{
long num = 313222313;
// The result of the asynchronous call to is_prime will be stored in the_future
std::future<bool> the_future = std::async (is_prime, num);
std::cout << "Checking whether " << num << " is a prime number!" << std::endl;
// Nothing beyond this line runs until the function completes
bool result = the_future.get();
// Interpret the result
interpret_result (result);
// So the cmd window stays open
system ("pause");
return 0;
}
А вот мой make-файл (я хотел бы создать его для каждого проекта просто на практике):
COMPILER = g++
COMPILER_FLAGS = -std=c++17 -Wall -g
LINKER_FLAGS =
EXECUTABLE = async
all: main clean
main: main.o
$(COMPILER) $(LINKER_FLAGS) -o $(EXECUTABLE) main.o
main.o: main.cpp
$(COMPILER) $(COMPILER_FLAGS) -c main.cpp
.PHONY: clean
clean:
rm *.o
Я не уверен, почему этот код не компилируется.Я прошел через это и не могу определить какие-либо ошибки.mingw
успешно обновлен (после этого я перезапустил свой терминал).
Буду признателен за любую помощь.