c++ - C ++中的线程函数参数问题
问题描述
这个 main 函数的目的是找到一个范围内的素数数量,使用线程将问题划分为选定数量的线程。我遇到了 std::thread 问题,并且由于参数而出现错误。我不确定如何解决它。任何帮助将不胜感激。
这是错误:
错误:没有匹配函数调用 '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);
}
解决方案
如果您遵循错误消息,则进一步的编译器会告诉您究竟是什么问题:
prog.cpp:41:82:注意:可变大小数组类型 'int (&)[numThreads]' 不是有效的模板参数 std::thread* th = new std::thread(myRun, minThread, maxThread, threadCount , 一世);
注意 C++ 中不允许使用 VLA,std::vector
而是使用 VLA,您仍然可以通过指针传递它的数据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] ) );
推荐阅读
- kubernetes - K8S 端口转发到安全集群中的服务
- fullcalendar - fullcalendar-vue 视图属性没有反应
- firebase - 我可以使用 yarn 作为包管理器来安装 firebase CLI 吗?
- python - 如何合并熊猫数据框中的单元格以用作标题?
- vba - 如何打印一系列页面?
- python - Seaborn Distplot 下的不同阴影
- c# - Task.Delay 与 DateTime.Now 的结合有多准确?
- javascript - 通过根据用户选择附加 url 进行深度链接
- reactjs - React-Redux 产生 TypeError 无法读取未定义的属性
- app-inventor - AppInventor - 一行列表中的三个值