Подтвердить что ты не робот

Использование флагов С++ 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 молча принимается во внимание? Я наблюдаю такое же поведение с этой опцией и без нее.

4b9b3361

Ответ 1

Так как этот ответ по-прежнему "без ответа", после разговора с некоторыми людьми из Lounge<C++>, я думаю, что могу сказать, что это довольно очевидно из комментариев, что это связано с ошибкой реализации на MinGW/MinGW -w64 или pthread в то время. Используя gcc 4.9.1, MinGW-W64, проблема больше не появляется. На самом деле, вышеприведенная программа, похоже, компилируется и запускается корректно даже в версии раньше 4.8.2 с поточной загрузкой POSIX.

Я сам не эксперт, думаю, что точная поездка происходит, когда программа, похоже, пытается дважды написать одно и то же обещание, которое, я думаю, должно быть большим, нет-нет, как std:: async должен написать свой результат только один раз (опять же, я не уверен, что я здесь, а другие комментарии и изменения, скорее всего, уточнят).

Кроме того, это может быть связана с проблемой: std:: future exception в gcc экспериментальной реализации С++ 0x