C++ promise.set_value 在 linux 下因未知错误而失败

C++ promise.set_value fails with unknown error under linux

我正在尝试在我们的高性能服务器上进行模拟 运行。它(不幸的是)使用 CentOS Linux release 7.7.1908 (Core) 而不是我正在开发程序的 Win10。随之而来的是大量错误,其中一个我无法在我的 on:

上修复
#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”编译时,输出看起来像我期望的那样:

Desktop>test.exe

Initialized i

Constructed promise

Set value

Retrieved future

Got value: 1234

另一方面,当用“g++ -std=c++11 test.cpp”在服务器上编译时,输出是不同的:

~/test_dir$ ./a.out

Initialized i

Constructed promise

terminate called after throwing an instance of 'std::system_error'

what(): Unknown error -1

Aborted

在 Ubuntu 16.04.6 LTS 机器上尝试此操作时,我确实遇到了同样的错误。我不明白为什么会这样。 显然,这一行中有些可疑: promise.set_value(std::move(i)) 因为之前的输出被打印出来,而该语句之后的行不再执行。此外,编译器/链接器确实找到了两个版本之一“void set_value (const T& val);”或“void set_value (T&& val);”这适用于模板规范“int”,我强烈怀疑后者。

但是为什么在将整数设置为 promise 的值时程序中止?即使同时内联值和跳过变量也会产生错误。

谁能告诉我错误在哪里?

尝试使用 pthread 标志进行编译:

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