C ++ promise.set_value завершается с неизвестной ошибкой в ​​Linux - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь запустить симуляцию на нашем высокопроизводительном сервере. К сожалению, он использует CentOS Linux версии 7.7.1908 (Core) вместо Win10, под которой я разрабатываю программу. Это привело к большому количеству ошибок, одну из которых я не смог исправить на:

#include <future>
#include <iostream>

int main(int argument_count, char** arguments) {
    int i = 1234;
    std::cout << "Initialized i" << std::endl;

    std::promise<int> promise;
    std::cout << "Constructed promise" << std::endl;

    promise.set_value(std::move(i));
    std::cout << "Set value" << std::endl;

    std::future<int> future = std::move(promise.get_future());
    std::cout << "Retrieved future" << std::endl;

    int j = std::move(future.get());
    std::cout << "Got value: " << j << std::endl;

    return 0;
}

При компиляции в Win10 с помощью "cl test.cpp" вывод выглядит так, как будто я 'ожидаемое ожидание:

Рабочий стол> test.exe

Инициализированный i

Построенное обещание

Заданное значение

Полученное будущее

Полученное значение: 1234

С другой стороны, при компиляции на сервере с помощью "g ++ -std = c ++ 11 test.cpp" вывод будет другим:

~ / test_dir $ ./a.out

Инициализированный i

Построенное обещание

завершить вызов после выброса экземпляра 'std :: system_error'

what (): Неизвестная ошибка -1

Прервано

Я получаю ту же ошибку при попытке выполнить это на компьютере с Ubuntu 16.04.6 LTS. Я не понимаю, почему это происходит. Очевидно, что в этой строке что-то подозрительно: promise.set_value(std::move(i)), поскольку вывод до выводится, а строка после этого оператора больше не выполняется. Кроме того, компилятор / компоновщик находит одну из двух версий "void set_value (const T & val);"или "void set_value (T && val);"это было бы уместно для спецификации шаблона "int", я сильно подозреваю, что позже.

Но почему программа прерывается при установке целого числа в качестве значения обещания? Даже когда встраивание значения и пропуск переменной вместе приводит к ошибке.

Может кто-нибудь указать мне, где ошибка?

1 Ответ

1 голос
/ 21 октября 2019

Попробуйте скомпилировать, используя флаг pthread:

g++ -std=c++11 test.cpp -pthread

...