Использование 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

Другие вопросы по тегам