Я пытаюсь сделать многопоточность и ниже это функция, которую я хочу быть потоком:
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);
Я не понимаю, как решить проблему, спасибо!
В случае 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);
Других решений пока нет …