在学校,我们上周开始使用多线程,现在我们已经在使用多处理了,我对它有点迷茫,所以我要向你解释这个问题。对于一个练习,我们必须制作一个模拟 10000 场游戏的赌场游戏模拟器,以便我们知道赌场赢得游戏的频率。所以我编写了模拟器,我有 5 种方法来运行游戏:
static void game(Croupier croupier)
{
croupier.createNewCardDeck();
croupier.shuffleCards();
croupier.giveCardsToPlayers();
croupier.countPlayerPoints();
croupier.displayResults();
}
如果我在 10000 次迭代的经典 for 循环中调用游戏,它运行正常,大约需要 2 秒,银行赢了 50% 的时间。
如果我使用 Parallel.For,它会在 shuffleCards 上崩溃,因为(我认为)多个进程正在尝试同时编辑同一组卡片。
我的第一个想法是在我的 shuffleCards 上放置一个 Mutex,但它会减慢模拟速度,而使用并行编程的目的是提高速度。所以我想在不同的过程中分离数据(所以我不是 10000 次迭代,而是在 4 个过程中进行 2500 次,每个循环都有自己的荷官、玩家、卡片等......)
您认为解决此问题的最佳方法是什么?您是否有任何简单的教程来解释如何处理使用相同数据的并行工作?您会选择哪种解决方案?谢谢
编辑:ShuffleCard 方法
List<Card> randomList = new List<Card>();
Random r = new Random();
int randomIndex = 0;
while (_cards.Count > 0)
{
randomIndex = r.Next(0, _cards.Count); //Choose a random object in the list
randomList.Add(_cards[randomIndex]); //add it to the new, random list
_cards.RemoveAt(randomIndex); //remove to avoid duplicates
}
return randomList;
所以是的 _cards 是荷官的私有财产(调用 this._cards = shuffleCards() ,每个进程都有相同的卡片列表