C++ promise.set_value在Linux下失败,出现未知错误

xam8gpfp  于 2023-01-22  发布在  Linux
关注(0)|答案(2)|浏览(180)

我试图让我的模拟运行在我们的高性能服务器上。它(不幸的是)使用CentOS Linux版本7.7.1908(核心),而不是Win10,我在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”编译时,输出是不同的:
~/测试目录$ ./a.输出
初始化i
推定承诺
引发“std::system_error”示例后调用了terminate
what():未知错误-1
流产
当我在Ubuntu 16.04.6 LTS机器上尝试这个操作时,我得到了同样的错误。我不明白为什么会发生这种情况。很明显,这行代码有些可疑:promise.set_value(std::move(i)),因为之前的输出被打印,并且该语句之后的行不再执行。此外,编译器/链接器确实找到了两个版本中的一个“void set_value(const T& val);“或“无效设置值(T&& val);“那将适合于模板规范“int”,我强烈怀疑后者。
但是为什么当设置一个整数作为一个承诺的值时程序会中止呢?即使是在内联值和跳过变量的同时也会产生错误。
谁能告诉我哪里出错了?

jq6vz3qz

jq6vz3qz1#

尝试使用pthread标志进行编译:
g++ -std=c++11 test.cpp -pthread

cetgtptt

cetgtptt2#

同时针对pthreadstdc++进行链接可能会解决此问题。在Cmake中添加stdc++的示例:

target_link_libraries(
        # Your library or binary here
        stdc++
        pthread
    )

使用以下代码进行测试:

#include <iostream>
#include <future>

int main(int argc, char *argv[]) {
    static_cast<void>(argc);
    static_cast<void>(argv);

    std::promise<int> pr;
    auto fut = pr.get_future();
    pr.set_value(10);
    std::cout << fut.get() << std::endl;

    return 0;
}

相关问题