gpt4 book ai didi

c# - 使我的代码线程安全时遇到问题

转载 作者:行者123 更新时间:2023-12-03 12:46:29 26 4
gpt4 key购买 nike

CreateNewRound() 方法在运行时被多个线程访问。假设 _game.CurrentRound = 99 并且两个线程同时访问该方法并且它们都将 currentRoundId 初始化为 100 并且两个线程都添加了具有相同 roundId 的两个实体。但这是错误的,我不希望这种情况发生,因为轮次应该是独一无二的和不同的。我该如何解决这个问题,以便第一个线程添加一个第 100 轮的实体,另一个添加第 101 轮的实体。


public void CreateNewRound()
{
var game = _cache.GetGameById(_session.gameId);
var currentRoundId = game.CurrentRound + 1;

var response = SomeAPI.SomeCall();
if (response.responseCode == (int)responseCodes.Success)
{
_dbContext.GameState.Add(new GameState() { RoundId = CurrentRoundId });
_dbContext.SaveChanges();
}
}

最佳答案

如果(且仅当)所有调用的方法都是纯方法,即结果仅取决于输入参数,您可以简单地使用 interlocked.Increment 来确保每次调用的 currentRound 都是唯一的:

    private int currentRound = 0;
public void CreateNewRound()
{
var thisRound = Interlocked.Increment(ref currentRound);
var gamestate = CreateGameState(thisRound)
// process game state
}

在大多数游戏中,下一轮将取决于上一轮的游戏状态。在这种情况下,您必须按顺序运行每一轮。典型的解决方案是为此使用锁:

    private int currentRound = 0;
private object myLock = new object();
private MyGameState gameState;
public void CreateNewRound()
{
lock (myLock)
{
currentRound++;
gameState = ComputeNextGameState(gameState, currentRound);
// process game state
}
}

还有一些替代方案,例如分配一个特定线程来执行所有游戏状态更新,并使 CreateNewRound 仅要求更新线程执行更新。

关于c# - 使我的代码线程安全时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63523388/

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