Ray*_*jax 0 c# parallel-processing simulator multiprocessing
在学校,我们上周开始进行多线程处理,现在我们已经进行了多处理,我有点迷失了,所以我将向你解释这个问题.对于练习,我们必须制作一个模拟10000个游戏的赌场游戏模拟器,以便我们知道赌场赢得游戏的频率.所以我编写了模拟器,我有5种方法来运行游戏:
static void game(Croupier croupier)
{
croupier.createNewCardDeck();
croupier.shuffleCards();
croupier.giveCardsToPlayers();
croupier.countPlayerPoints();
croupier.displayResults();
}
Run Code Online (Sandbox Code Playgroud)
如果我在10000次迭代的经典for循环中调用游戏,则运行正常,大约需要2秒,并且银行赢得50%的次数.
如果我使用Parallel.For,它会在shuffleCards上崩溃,因为(我认为)多个进程正在尝试同时编辑同一包卡.
我的第一个想法是将Mutex放在我的shuffleCards上,但是当使用并行编程来提高速度时,它会减慢模拟速度.所以我想把不同进程的数据分开(所以我不是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;
Run Code Online (Sandbox Code Playgroud)
所以是_cards是croupier的私有财产(调用this._cards = shuffleCards(),每个进程都有相同的卡列表
你的想法是要走的路:给每个"处理单元"(即线程,任务)自己的游戏桌(赌场,玩家,牌).就像在真正的赌场中一样,你可以拥有任意数量的游戏桌,同时玩,彼此独立,因为他们不共享任何数据.每当游戏结束时,结果将转移到银行(您只有一个).因此,唯一必须同步的(与批评部分)是将结果汇总到银行.
这个例子是并行编程的完美琐碎的例子,因为现实世界可以直观地建模到相应的类和算法中.
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |