gpt4 book ai didi

C++ 游戏 : pthread_cond_signal doesn't wake up opponent thread

转载 作者:行者123 更新时间:2023-11-30 02:07:20 25 4
gpt4 key购买 nike

我正在制作一款用户与计算机对战的游戏。轮到玩家时,计算机对手会考虑下一步行动。如果玩家移动到计算机对手计划移动的位置,计算机对手将重新开始搜索它的移动。

下面是主函数和对手函数的概要:

[更新]

pthread_mutex_t mutex;
pthread_cond_t cond;

int main() {
// ... initialize game variables, args to pass to opponent ...

pthread_t thread;
pthread_create(&thread, NULL, opponent, &args);
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);

while(!isGameOver()) {
pthread_mutex_lock(&mutex);

if(getCurrentPlayer() != PLAYER) {
pthread_cond_wait(&cond, &mutex);
}

if(getCurrentPlayer() == PLAYER) {
// ... update board with player's move ...

setCurrentPlayer(OPPONENT);

pthread_cond_signal(&cond);
}

pthread_mutex_unlock(&mutex);
}
}

void * opponent(void * args) {
// initialize move to something invalid

while(!isGameOver()) {
if(!isValid(move)) {
move = findMove();
}

pthread_mutex_lock(&mutex);

if(getCurrentPlayer() != OPPONENT) {
pthread_cond_wait(&cond, &mutex);
}

if(getCurrentPlayer() == OPPONENT) {
if(isValid(move)) {
// ... update board with opponent's move ...

setCurrentPlayer(PLAYER);

pthread_cond_signal(&cond);
}
}

pthread_mutex_unlock(&mutex);
}
}

目前,这似乎是正在发生的事情:[更新]

  • 对手找到他的着法(findMove)
  • 对手锁定互斥体(pthread_mutex_lock)
  • 对手开始等待(pthread_cond_wait)
  • 主函数锁定互斥体(pthread_mutex_lock)
  • 玩家开始行动
  • 主线程发信号表明轮到对手了(pthread_cond_signal)

然后,什么也没有发生。

我想要发生的事情(将互斥锁锁定在适当的位置):

  • 对手找到他的着法(findMove)
  • 对手开始等待(pthread_cond_wait)
  • 玩家开始行动
  • 主线程发信号表明轮到对手了(pthread_cond_signal)
  • 对手停止等待
  • 对手做出了它之前考虑的行动
  • 对方切换当前玩家(setCurrentPlayer)
  • 重复

我对线程并没有真正的经验,所以有人可以帮助我解决这里发生的问题,以及我如何修复它吗?我不知道我是否在正确的位置设置了互斥锁锁定/解锁、条件信号/等待和 setCurrentPlayer 函数。

最佳答案

当您调用 pthread_cond_wait 时,应该锁定互斥量 - 该函数自动解锁互斥量,等待信号,并在返回前重新锁定互斥量。互斥量的目的是序列化对共享状态(在本例中为当前玩家)的访问,因此它应该被锁定在任何访问它的周围。循环应该更像:

while(!isGameOver()) {
if(!isValid(move)) {
move = findMove();
}

pthread_mutex_lock(&mutex); // LOCK HERE
if(getCurrentPlayer() != OPPONENT) {
pthread_cond_wait(&cond, &mutex);
}

if(getCurrentPlayer() == OPPONENT) {
if(isValid(move)) {
// NOT HERE pthread_mutex_lock(&mutex);

// ... update board with opponent's move ...

setCurrentPlayer(PLAYER);

pthread_cond_signal(&cond);
// NOT HERE pthread_mutex_unlock(&mutex);
}
}
pthread_mutex_unlock(&mutex); // UNLOCK HERE
}

另一个线程也是如此。

关于C++ 游戏 : pthread_cond_signal doesn't wake up opponent thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com