C ++中线程函数参数的问题
Problem with thread function arguments in C++
这个主要功能的objective是使用threading来求一个范围内素数的个数,将问题分成选定的线程数。我在使用 std::thread 时遇到问题,并且由于参数而出现错误。我不确定如何修复它。任何帮助将不胜感激。
这里是错误:
error: no matching function for call to 'std::thread::thread(void (&)(int, int, int*, int), int&, int&, int [numThreads], int&)' std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
代码如下:
#include <iostream>
#include <thread>
static int isPrime(int n);
static int primesInRange(int min, int max);
void myRun(int min, int max, int* threads, int index);
int main()
{
int min = 0;
int max = 3;
int numThreads = 1;
std::thread* ths[numThreads];
int threadCount[numThreads];
int minThread = 0;
int maxThread = 0;
int formerMax = 0;
for (int i = 0; i < numThreads; i++)
{
if (i == 0)
{
minThread = min;
maxThread = min + (max - min)/numThreads;
formerMax = maxThread;
}
else
{
minThread = formerMax + 1;
maxThread = minThread + (max - min)/numThreads;
formerMax = maxThread;
}
if (maxThread > max)
{
maxThread = max;
}
std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
ths[i] = th;
}
}
void myRun(int min, int max, int* threads, int index)
{
threads[index] = primesInRange(min, max);
}
int numThreads = 1;
std::thread* ths[numThreads];
int threadCount[numThreads];
这不是合法的 C++ 代码。 C++ 没有变长数组。一些编译器将它们作为扩展提供,但如果您使用它们,基本上就得靠自己了。他们与其他语言的交互没有很好的记录。在这里,您的模板参数推导没有按预期工作。
不要在 C++ 中使用可变长度数组,而是使用 std::vector
。
顺便说一句,您不需要 new
线程对象或使用指向 std::thread
的指针。试试 std::vector<std::thread>
.
如果您遵循错误消息,编译器会进一步告诉您问题所在:
prog.cpp:41:82: note: variable-sized array type ‘int
(&)[numThreads]’ is not a valid template argument
std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
注意 C++ 中不允许使用 VLA,请改用 std::vector
,您仍然可以通过指向 int
的指针传递它的数据
std::vector<std::thread> ths( numThreads );
std::vector<int> threadCount( numThreads );
....
ths[i] = std::thread(myRun, minThread, maxThread, threadCount.data(), i);
但将引用传递给 int
会更清晰:
void myRun(int min, int max, int &count );
然后稍后:
ths[i] = std::thread(myRun, minThread, maxThread, std::ref( threadCount[i] ) );
这个主要功能的objective是使用threading来求一个范围内素数的个数,将问题分成选定的线程数。我在使用 std::thread 时遇到问题,并且由于参数而出现错误。我不确定如何修复它。任何帮助将不胜感激。
这里是错误:
error: no matching function for call to 'std::thread::thread(void (&)(int, int, int*, int), int&, int&, int [numThreads], int&)' std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
代码如下:
#include <iostream>
#include <thread>
static int isPrime(int n);
static int primesInRange(int min, int max);
void myRun(int min, int max, int* threads, int index);
int main()
{
int min = 0;
int max = 3;
int numThreads = 1;
std::thread* ths[numThreads];
int threadCount[numThreads];
int minThread = 0;
int maxThread = 0;
int formerMax = 0;
for (int i = 0; i < numThreads; i++)
{
if (i == 0)
{
minThread = min;
maxThread = min + (max - min)/numThreads;
formerMax = maxThread;
}
else
{
minThread = formerMax + 1;
maxThread = minThread + (max - min)/numThreads;
formerMax = maxThread;
}
if (maxThread > max)
{
maxThread = max;
}
std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
ths[i] = th;
}
}
void myRun(int min, int max, int* threads, int index)
{
threads[index] = primesInRange(min, max);
}
int numThreads = 1;
std::thread* ths[numThreads];
int threadCount[numThreads];
这不是合法的 C++ 代码。 C++ 没有变长数组。一些编译器将它们作为扩展提供,但如果您使用它们,基本上就得靠自己了。他们与其他语言的交互没有很好的记录。在这里,您的模板参数推导没有按预期工作。
不要在 C++ 中使用可变长度数组,而是使用 std::vector
。
顺便说一句,您不需要 new
线程对象或使用指向 std::thread
的指针。试试 std::vector<std::thread>
.
如果您遵循错误消息,编译器会进一步告诉您问题所在:
prog.cpp:41:82: note: variable-sized array type ‘int (&)[numThreads]’ is not a valid template argument std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount, i);
注意 C++ 中不允许使用 VLA,请改用 std::vector
,您仍然可以通过指向 int
std::vector<std::thread> ths( numThreads );
std::vector<int> threadCount( numThreads );
....
ths[i] = std::thread(myRun, minThread, maxThread, threadCount.data(), i);
但将引用传递给 int
会更清晰:
void myRun(int min, int max, int &count );
然后稍后:
ths[i] = std::thread(myRun, minThread, maxThread, std::ref( threadCount[i] ) );