正确的线程调用语法?错误:没有匹配调用std :: thread :: thread(<brace-enclosed initializer =“”list =“”>)</brace-enclosed>

时间:2013-11-11 20:49:46

标签: c++ multithreading c++11 stdthread

我正在尝试创建一个运行类函数的线程。我觉得我做错了什么地方靠近主要地方的底部RowChecker r0(puz, 0, s); thread rt0 {r0.check()};。我的编译器(g ++)告诉我有no matching function for call to ‘std::thread::thread(<brace-enclosed initializer list>)’ 所以我明白我没有正确拨打电话。格式化此调用以创建新线程的正确方法是什么?

#include <iostream>
#include <thread>

using namespace std;

class Sum
{
private:
    int sum;
public:
    Sum();
    int getSum();
    void addSum();
};

class RowChecker
{
private:
    int puz[9][9];
    int myRow;
    Sum* sum;
public:
    RowChecker(int puzzel[9][9], int row, Sum* shared);
    void check();
};

Sum::Sum() {
    sum = 0;
}

int Sum::getSum() {
    return sum;
}

void Sum::addSum() {
    ++sum;
}

RowChecker::RowChecker(int puzzel[9][9], int row, Sum* shared) {
    for (int i=0; i<9; ++i) {
        for (int j=0; j<9; ++j) {
            puz[i][j] = puzzel[i][j];
        }
    }
    myRow = row;
    sum = shared;
}

void RowChecker::check() {
    char table[] = {0,0,0, 0,0,0, 0,0,0};
    for (int i=0; i<9; ++i) {
        if (puz[i][myRow]<10 && puz[i][myRow]>=0) {
            table[puz[i][myRow]] = 1;
        }
    }
    for (int i=0; i<9; ++i) {
        if (table[i]==0) {
            return;
        }
    }
    sum->addSum();
}

void readPuzzel(int puz[9][9]){
    for (int i=0; i<9; ++i) {
        for (int j=0; j<9; ++j) {
            puz[i][j] = rand() % 10;
        }
    }
}

int main()
{
    Sum s;

    int puz[9][9];
    readPuzzel(puz);

    RowChecker r0(puz, 0, &s);

    thread rt0 {r0.check()};

    rt0.join();

    cout << "Sum s is " << s.getSum() << endl;

    return 0;
}

抱歉这个长度。此外,我知道传递数组是一个很好的方式来引入错误。我打算将事情转换为矢量。

1 个答案:

答案 0 :(得分:5)

您需要将函数传递给thread的构造函数。在您的代码中,您调用 r.check()并将结果传递给thread的构造函数,并且采用此类参数的构造函数不会存在,因此错误。

thread构造函数接受函数和参数。在成员函数的情况下,第一个参数是this指针。因此,对于您需要的代码:

thread rt0 { &RowChecker::check, &r0 };

这会在RowChecker::check上致电r0