В следующем коде нужна опция pthread link для компиляции, и я не понимаю почему. Есть ли у вас какие-либо идеи?
Я использую gcc 7.2.0
#include <future>
int sum = 0;
void func()
{
for(int i=0; i < 10; ++i)
sum +=i;
}
int main()
{
std::future<void> f = std::async(std::launch::async, func);
return 0;
}
Компилирование с
g++ -o test test.cpp
предоставляет следующую ошибку
/tmp/ccoEkyeZ.o: dans la fonction « std::thread::thread<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::{lambda()#1}>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::{lambda()#1}&&) »:
test.cpp:(.text._ZNSt6threadC2IZNSt13__future_base17_Async_state_implINS_8_InvokerISt5tupleIJPFvvEEEEEvEC4EOS8_EUlvE_JEEEOT_DpOT0_[_ZNSt6threadC5IZNSt13__future_base17_Async_state_implINS_8_InvokerISt5tupleIJPFvvEEEEEvEC4EOS8_EUlvE_JEEEOT_DpOT0_]+0x30): référence indéfinie vers « pthread_create »
collect2: error: ld returned 1 exit status
при использовании
g++ -o test test.cpp -lpthread
не имеет проблем.
это нормально? я что-то пропустил? мой код не имеет где-то pthread_create
Ваш код может не иметь pthread_create
в этом, но подумайте на минуту, что на самом деле влечет за собой асинхронная обработка.
Почти наверняка асинхронная функция будет выполняться в отдельном потоке, так что она может работать асинхронно с основным кодом. Это должно быть видно по тому, что ваше сообщение об ошибке содержит текст std::thread
несколько раз.
И в вашей среде кажется, что std::thread
использует нитки под одеялом.
Это действительно не отличается от вашего кода, содержащего cout << someInt
и, возможно, жаловаться на пропавших без вести itoa
-подобная функция для выполнения преобразования целых чисел в строку. Ваша установка, вероятно, будет серьезно повреждена, если она будет включать потоки, но не будет стандартных преобразований, кроме концепция все еще в силе.
Исполняемый файл должен иметь доступ ко всем вещам, которые вы явно вызываете, плюс все другие зависимости, которые влечет за собой.
Для чего это стоит, это является покрыты (хотя и смутно) в GCC документы (мой акцент):
Когда вы связываете многопоточное приложение, вам, вероятно, потребуется добавить библиотеку или флаг в
g++
, Это очень нестандартная область GCC между портами. Некоторые порты поддерживают специальный флаг (орфография еще даже не стандартизирована) для добавления всех необходимых макросов в компиляцию (если требуются какие-либо такие флаги, вы должны предоставить флаг для всех компиляций, а не только для компоновки) и дополнений библиотеки ссылок и / или замены во время ссылки. Документация слабая.По нескольким целям (включая GNU / Linux, Solaris и различные BSD)
-pthread
это честь
Других решений пока нет …