Многопоточность — прототип

Я пытаюсь сделать многопоточность и ниже это функция, которую я хочу быть потоком:

void  AIShell::vertCombos ( int &my_combo, int& opp_combo, int &score, int ** gameState){
int my_combos = 0;
int opp_combo =0;
it score = 0;
for (int i = 0; i < numCols; i++){
my_combo = 0;
opp_combo = 0;
for (int j = 0; j < numRows; j++){
if (gameState[i][j] == NO_PIECE){
++my_combo;
++opp_combo;
}
else if (gameState[i][j] == AI_PIECE){
++my_combo;
opp_combo = 0;
}
else if (gameState[i][j] == HUMAN_PIECE){
my_combo = 0;
++opp_combo;
}

if (my_combo == k){
++score;
my_combo = k-1;
}
if (opp_combo == k){
--score;
opp_combo = k-1;
}
}
}
pthread_exit(NULL);
}

Я пытаюсь создать поток в другой функции, выполнив:

 pthread_create (0, NULL, vertCombos,my_combo, opp_combo, score, gameState);

Но я получаю ошибку:

AIShell.cpp: в функции-члене int AIShell :: heuristic (int **) ‘:
AIShell.cpp: 224: 82: ошибка: невозможно преобразовать AIShell :: vertCombos из типа void (AIShell ::) (int&Int&Int&, int **) ’, чтобы ввести« void * () (Недействительный
pthread_create (0, NULL, vertCombos, my_combo, opp_combo, score, gameState);
^

Ive также попытался сделать следующее с той же функцией выше:

std::thread t1(vertCombos,my_combo, opp_combo, score, gameState);

затем

t1.join();

но это также приводит к ошибкам.
Я также попробовал:

 std::thread t1(vertCombos,my_combo, opp_combo, score, std::ref(gameState));

а также

 std::thread t1(AIShell::vertCombos,my_combo, opp_combo, score, gameState);

Я не понимаю, как решить проблему, спасибо!

0

Решение

В случае vertCombos не статический метод, вы должны передать экземпляр объекта AIShell в качестве второго параметра в thread конструктор:

std::thread t(&AIShell::vertCombos, aiShellObj, std::ref(my_combo), std::ref(opp_combo), std::ref(score), gameState);

Вы могли бы использовать лямбда функция вместо указателя функции:

// These parameters will be captured by lambda
int my_combo, opp_combo, score;
int **gameState = nullptr;

// gameState initialization is skipped

std::thread t([&](AIShell* obj){ obj->vertCombos(my_combo, opp_combo, score, gameState); }, &shell);

В противном случае, если vertCombos это статический метод:

std::thread t(&AIShell::vertCombos, std::ref(my_combo), std::ref(opp_combo), std::ref(score), gameState);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]