【发布时间】:2019-12-08 15:47:33
【问题描述】:
这与学术有关。
我是基于同步的编程的新手,在为类似这样的程序创建伪代码时遇到了麻烦:
有一个导演和N个球员。这 导演(独立线程)洗牌(shuffle cards()),邀请玩家 (邀请玩家()),然后(分发卡片())。导演给 控制权交给第一个玩家,他暂停自己直到游戏结束。一旦导演 收到游戏结束的通知后,他检查记录(check game())以验证卡片是否 按照规则玩。
每个播放器都作为单独的线程运行。在可能的初始化之后,玩家等待直到她 示意打牌。然后她打出一张牌(play card())。 如果当前活跃的玩家检测到游戏已经结束(end of game() 为真),她 通知导演游戏结束并退出。如果游戏还没有结束,玩家会发出信号 下一位玩家并暂停自己,直到再次轮到她。
这是我想出的(记住消费者生产者问题)。请提供您的反馈和建议:
void Director()
{
shuffle_cards();
invite_players();
distribute_cards();
up(&full);
down(&empty);
check_game();
}
void Player()
{
down(&full);
down(&mutex);
play_card();
if (end_of_game == true){
up(&empty);
}
}
【问题讨论】:
-
欢迎来到 SO!很好的问题,但我有点不清楚游戏玩法是如何进行的。玩家是否按照特定的顺序进行,比如
0..n,它只是对所有人免费还是对卡牌/游戏影响排序做了一些事情(换句话说,你提到的“规则”是什么)?谢谢。 -
我们没有收到任何有关订单的信息。但我猜想考虑它是从 0 到 N 或者可能根据分布顺序(只有在它不会太复杂的情况下)是有意义的。@ggorlen
-
在这种情况下,我假设 check_game() 函数已经给出。 @ggorlen
-
谢谢。另一个问题:线程是否应该在等待轮到他们的时候继续工作(例如考虑他们的动作是什么)还是阻塞?我假设是第一个,因为如果它们一个接一个地运行而没有重叠,就没有理由使用多线程。
-
好吧,我们没有提供任何与此相关的信息。问题是“如果游戏还没有结束,玩家会向下一个玩家发出信号并暂停自己,直到再次轮到她。”也许现在,我们可以只考虑第一个回合的情况。 @ggorlen
标签: c multithreading synchronization semaphore