我试图让我的模拟运行在我们的高性能服务器上。它(不幸的是)使用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”,我强烈怀疑后者。
但是为什么当设置一个整数作为一个承诺的值时程序会中止呢?即使是在内联值和跳过变量的同时也会产生错误。
谁能告诉我哪里出错了?
2条答案
按热度按时间jq6vz3qz1#
尝试使用
pthread
标志进行编译:g++ -std=c++11 test.cpp -pthread
cetgtptt2#
同时针对
pthread
和stdc++
进行链接可能会解决此问题。在Cmake中添加stdc++
的示例:使用以下代码进行测试: