После возникновения сбоев при введении вложенных вызовов 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
молча принимается во внимание? Я наблюдаю такое же поведение с этой опцией и без нее.