C ++中线程函数参数的问题

问题描述

该主函数的目标是使用线程将问题划分为选定的线程数,从而找到某个范围内的素数个数。我在使用 std::thread 时遇到问题,并且由于参数而出现错误。我不知道如何解决它。任何帮助将不胜感激。

这里是错误

错误:没有匹配的函数调用'std::thread::thread(void (&)(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,i);
    ths[i] = th;
}
}


void myRun(int min,int index)
{
    threads[index] = primesInRange(min,max);
}

解决方法

如果您遵循错误消息,编译器会进一步告诉您问题所在:

prog.cpp:41:82:注意:可变大小的数组类型‘int (&)[numThreads]' 不是有效的模板参数 std::thread* th = new std::thread(myRun,minThread,maxThread,threadCount,i);

注意 C++ 中不允许使用 VLA,请改用 sheet.removeRow(row); ,您仍然可以通过指向 std::vector 的指针传递它的数据

int

但将引用传递给 std::vector<std::thread> ths( numThreads ); std::vector<int> threadCount( numThreads ); .... ths[i] = std::thread(myRun,threadCount.data(),i); 会更清晰:

int

然后:

void myRun(int min,int max,int &count );
,
int numThreads = 1;

std::thread* ths[numThreads];
int threadCount[numThreads];

这不是合法的 C++ 代码。 C++ 没有变长数组。一些编译器提供它们作为扩展,但如果你使用它们,你基本上是靠你自己的。它们与语言其余部分的交互没有很好的记录。在这里,您的模板参数推导无法按预期工作。

不要在 C++ 中使用变长数组,而是使用 std::vector

在不相关的说明中,您不需要new 线程对象或使用指向std::thread 的指针。试试std::vector<std::thread>