Использование C++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;
}
Я наблюдаю два разных вида сбоев: (примерно в каждом пятом прогоне)
- Прекращение с помощью "Это приложение запросило среду выполнения прекратить его необычным способом".
- Завершение после создания экземпляра 'std::future_error', what(): Обещание уже выполнено.
Среда:
- 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 в gcc экспериментальной реализации C++0x