std::threads 构造函数参数错误
std::threads constructor argument error
我不是一个好的C++程序员,但目前正在使用C++的一些功能来清理我的C代码的脏部分。g++编译器抱怨threads[i] = thread(split, i, sums[i], from, to, f, nThreads);
。请帮我找到问题。
mjArray
只是一个瘦的类,而不是 std::vector,这在我的情况下太重了。
#include <cstdio>
#include <cmath>
#include <ctime>
#include <thread>
using namespace std;
template<typename T>
class mjArray {
private:
T* _array;
int _length;
public:
mjArray(int length) {
_array = new T[length];
_length = length;
}
mjArray(int length, T val) {
_array = new T[length];
_length = length;
for (int i = 0; i < length; ++i) {
_array[i] = val;
}
}
~mjArray() {
delete[] _array;
}
T& operator[](int i) {
return _array[i];
}
int length() {
return _length;
}
};
void split(int n, double& sum, int from, int to, double (*f)(double), int nThreads) {
for (int i = from + n; i <= to; i += nThreads) {
sum += f(i);
}
}
double sigma(int from, int to, double (*f)(double), int nThreads) {
double sum = 0.0;
mjArray<double> sums(nThreads, 0.0);
mjArray<thread> threads(nThreads);
for (int i = 0; i < nThreads; ++i) {
threads[i] = thread(split, i, sums[i], from, to, f, nThreads);
}
for (int i = 0; i < nThreads; ++i) {
threads[i].join();
sum += sums[i];
}
return sum;
}
double f(double x) {
return (4 / (8 * x + 1) - 2 / (8 * x + 4) - 1 / (8 * x + 5) - 1 / (8 * x + 6)) / pow(16, x);
}
int main(void) {
for (int i = 1; i <= 4; ++i) {
time_t start = clock();
double pi = sigma(0, 1000000, f, i);
time_t end = clock();
printf("pi = %.10f; nThreads = %d; elapsed = %.3fsn", pi, i, (double)(end - start) / CLOCKS_PER_SEC);
}
return 0;
}
#include <functional>
threads[i] = thread(split, i, std::ref(sums[i]), from, to, f, nThreads);
// ~~~~~~~~^
理由:
std::thread
存储传递给其构造函数的参数的衰减副本,然后std::move
这些副本以初始化在该新线程中运行的函子对象的参数。在引用的情况下,这将失败,因为您无法使用 xvalue 初始化非 const 左值引用(double&
split
函数期望的引用((更不用说它是一个与您传递给构造函数thread's
完全不同的double
实例(。
解决方案是使用从帮助程序函数返回std::reference_wrapper<T>
std::ref
这会将您的引用包装在可复制的对象中,从而成功地将您的引用传输到新创建的线程。
相关文章:
- 如何通过参数抛出错误消息
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 为什么 std::绑定错误参数可以成功?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- g++ 为 transform() 的参数生成错误
- 如何在C++中使用 Void 而不会收到有关参数的错误
- 错误:参数中无效地使用了无效表达式
- xgboost 构建错误:参数包未扩展为"..":
- src/caffe/parallel.cpp:70:1:错误:“参数”未命名类型
- OpenCV 错误:ERClassifierNM1 中的错误参数
- 为什么显示错误:参数太少而无法正常工作
- 算法错误:参数无法从对中掩盖 1
- 类模板方法的专用化,类型名称是类模板 - 错误:参数处的类型/值不匹配
- C++连接函数错误-参数无效
- 错误:参数无效
- (自适应)opencv中的阈值错误(cvarrToMat中的错误参数(未知数组类型))
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- OpenCV 2.2:未知函数中的错误参数,文件.. .ocv OpenCV modulescoresr
- 错误:参数声明的存储类说明符无效