我已经编写了一个游戏,在允许其他玩家访问之前,使用信号量将“玩家”移动到棋盘上以锁定棋盘。
为了简洁起见,我会跳过大部分代码,但这里是我搞砸的事情。
第一个是为其中一个“玩家”运行线程的函数
void* xTurn(){
int move; //generate random number to place items on board
move = rand()%4+1;
//generates a number between 1 and 4
while(tokens!=0){ //while there are still "tokens" on the board, continue
sem_wait(&sB);
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
if(board[i][j] == 'X'){
switch(move){
case '1':
if(i++>8){
xTurn();
}
else{
if(board[i++][j]=='a'){
xScore++;
tokens--;
}
if(board[i++][j]=='A'){
xScore+2;
tokens--;
}
board[i][j]='-';
board[i++][j]='X';
break;
}
case '2':
if(i--<0){
xTurn();
}
else{
if(board[i--][j]=='a'){
xScore++;
tokens--;
}
if(board[i--][j]=='A'){
xScore+2;
tokens--;
}
board[i][j]='-';
board[i--][j]='X';
break;
}
case '3':
if(j++>8){
xTurn();
}
else{
if(board[i][j++]=='a'){
xScore++;
tokens--;
}
if(board[i][j++]=='A'){
xScore+2;
tokens--;
}
board[i][j]='-';
board[i][j++]='X';
break;
}
case '4':
if(j--<0){
xTurn();
}
else{
if(board[i][j--]=='a'){
xScore++;
tokens--;
}
if(board[i][j--]=='A'){
xScore+2;
tokens--;
}
board[i][j]='-';
board[i][j--]='X';
break;
}
}
}
}
}
}
sem_post(&sB);
}
我在这里叫它。假设我有方法yTurn和zTurn;印刷品以类似的方式进行。
void playgame(){
createBoard();
srand (time(NULL));
sem_init(&sB,0,0);
pthread_create(&tX,NULL,&xTurn,NULL);
pthread_create(&tY,NULL,&yTurn,NULL);
pthread_create(&tZ,NULL,&zTurn,NULL);
pthread_create(&tP,NULL,&print,NULL);
pthread_join(tX,NULL);
pthread_join(tY,NULL);
pthread_join(tZ,NULL);
pthread_join(tP,NULL);
if(xScore>yScore&&zScore){
cout<<"Player X Wins with a score of "<<xScore;
}
if(yScore>xScore&&zScore){
cout<<"Player Y Wins with a score of "<<yScore;
}
if(zScore>yScore&&xScore){
cout<<"Player Z Wins with a score of "<<zScore;
}
sleep(20);
menu();
}
当我运行它时,我得到两个不同的错误:
告诉我睡眠的一个没有声明,但是在运行Linux时会解决。 两个是 - 从'void *()()'到'void (*)的无效转换(void * _'[-fpermissive] pthread_create中的第三个参数出现此问题。 我不知道这意味着什么。我尝试了很多不同的东西,但对于如何解决这个问题没有丝毫想法
答案 0 :(得分:4)
pthread_create的签名是:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
所以你传递给它的函数必须带一个void *参数,即使你没有使用它,即你的声明应该是
void* xTurn(void*) ...
答案 1 :(得分:2)
由pthread_create
调用的线程函数应该有一个void *
参数并返回void *
值。
所以,改变:
void* xTurn()
到
void* xTurn(void *)