gpt4 book ai didi

c# - 结构数组,多线程,我可以同时写到不同的索引吗?

转载 作者:行者123 更新时间:2023-12-03 13:22:22 25 4
gpt4 key购买 nike

我有一个巨大的数组,其中包含一个结构“Tile”。我正在编写的程序是2D游戏,我不希望不同的玩家(由不同的线程处理)同时将其位置写入同一图块,我想知道两件事。两个线程可以安全地一次同时写入数组中的两个不同位置吗?有什么有效的方法可以只锁定该数组的一个索引吗?

最佳答案

是的,您可以同时从不同的线程写入不同的位置。

要进行锁定,您应该创建一个锁定数组,并根据写入的位置使用一些简单的哈希技术选择一个锁定。例如:

class TileArray
{
private static readonly int numLocks = 16;
private object[] locks = (from i in Range(0, numLocks) select new object()).ToArray();
private Tile[] tiles = hugeTileArray();

...

public Tile this[int i]
{
get { return tiles[i]; }
set
{
lock (locks[i % numLocks])
tiles[i] = value;
}
}
}

这避免了创建大量锁定的需要,但仍将锁定争用保持在最低水平。您可以根据分析将numLocks设置为向上或向下。但是,请保持2的幂以进行有效的模运算。

最后一个细节:提防混叠效果。例如,出于某些奇怪的原因,线程中可能有16个位置的多个位置很受欢迎,在这种情况下,争用将通过屋顶进行。在这种情况下,您将需要更强大的哈希。也许 (uint)i.GetHashCode() % numLocks会做,但是我不确定 Int32.GetHashCode会做什么。它可能只是返回数字本身。失败的话,您可以从 Bob Jenkins中窃取一个。

关于c# - 结构数组,多线程,我可以同时写到不同的索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271459/

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