我知道我可以使用一些.NET集合,它们是线程安全的,但是我仍然想了解以下情况:
我有一个Buffer类(如下),该类用于写入来自不同线程的数据,在更新循环间隔(游戏)中,主线程通过交换列表实例来处理数据(以防止两个线程作用于同一线程)实例)。
因此只有一个使用“ writerData”列表的附加线程,其他所有操作都在主线程上完成,但是我不确定Swap方法是否是“安全”线程,因为在搜索了一段时间后,每个人似乎对交换参考字段有不同的看法。
有人说交换引用不需要任何锁定,有人说在这种情况下必须使用Interlocked.Exchange,有人说不需要,而有人说必须违反字段,有人说关键字是“ evil”。 。
我知道线程是一个困难的话题,也许其他问题太广泛了,但是有人可以帮助我了解在Swap方法的特定情况下是否需要/哪种“锁定”?
public class Buffer
{
List<byte> readerData;
List<byte> writerData; // This is the only field which is used by the other thread (by calling the Add method), well and by the Swap method, which is called from the main thread
// This method is only called by the other thread and it's the only method which is called from there
public void Add(byte data)
{
writerData.Add(data);
}
// Called on the main thread, before handling the readerData
public void Swap()
{
var tmp = readerData;
readerData = writerData
writerData = tmp;
}
// ... some other methods (which are only called from the main thread) to get the data from the (current) readerData field after calling the Swap method
}