Использование флагов С++ 11: Вложенные вызовы std:: async crash: ошибка компилятора/стандартной библиотеки?
После возникновения сбоев при введении вложенных вызовов std:: async в моей реальной программе я смог воспроизвести проблему в следующем минимальном примере. Он падает часто, но не всегда. Вы видите что-то, что пойдет не так, или это ошибка компилятора или стандартной библиотеки? Обратите внимание, что проблема остается, если get()
вызывает фьючерсы.
#include <future>
#include <vector>
int main (int, char *[])
{
std::vector<std::future<void>> v;
v.reserve(100);
for (int i = 0; i != 100; ++i)
{
v.emplace_back(std::async(std::launch::async, [] () {
std::async(std::launch::async, [] { });
}));
}
return 0;
}
Я наблюдаю два разных типа сбоев: (примерно каждый пятый запуск)
- Прекращение с помощью "Это приложение попросило Runtime прекратить его необычным способом".
- Прекращение после бросания экземпляра 'std:: future_error', что(): обещание уже выполнено.
Окружающая среда:
- Windows 7
- gcc версия 4.8.2 (i686-posix-dwarf-rev3, построена
MinGW-W64), как это предусмотрено в Qt 5.3.2
- Вызов командной строки:
g++ -std=c++11 -pthread futures.cpp
- Скомпилировано и работает на двух независимых машинах
Вариант -pthread
?
Может быть, в моей среде по какой-то причине опция -pthread
молча принимается во внимание? Я наблюдаю такое же поведение с этой опцией и без нее.
Ответы
Ответ 1
Так как этот ответ по-прежнему "без ответа", после разговора с некоторыми людьми из Lounge<C++>
, я думаю, что могу сказать, что это довольно очевидно из комментариев, что это связано с ошибкой реализации на MinGW/MinGW -w64 или pthread в то время. Используя gcc 4.9.1, MinGW-W64, проблема больше не появляется. На самом деле, вышеприведенная программа, похоже, компилируется и запускается корректно даже в версии раньше 4.8.2 с поточной загрузкой POSIX.
Я сам не эксперт, думаю, что точная поездка происходит, когда программа, похоже, пытается дважды написать одно и то же обещание, которое, я думаю, должно быть большим, нет-нет, как std:: async должен написать свой результат только один раз (опять же, я не уверен, что я здесь, а другие комментарии и изменения, скорее всего, уточнят).
Кроме того, это может быть связана с проблемой: std:: future exception в gcc экспериментальной реализации С++ 0x