Я знаю, что есть коллекции .NET, которые являются поточно-ориентированными, которые я мог бы использовать, но я все еще хочу понять следующую ситуацию:
У меня есть класс Buffer (ниже), который используется для записи данныхиз другого потока, в интервале цикла обновления (игра) основной поток обрабатывает данные путем замены экземпляра списка (чтобы не допустить одновременного действия обоих потоков на один и тот же экземпляр).
Таким образом, существует толькоодин дополнительный поток, который использует список «writerData», все остальное делается в основном потоке, но я не уверен, что метод Swap является «безопасным» для потока, потому что после некоторого поиска у каждого, похоже, другое мнение по поводу обменасправочные поля.
Некоторые говорят, что обмен ссылками не требует какой-либо блокировки, другие говорят, что в этом случае необходимо использовать Interlocked.Exchange, другие говорят, что это не требуется, другие говорят, что поле должно быть нарушено, а другие говорят, что ключевое слово"злой".
Я знаю, что многопоточность - сложная тема, и, возможно, другие вопросы были слишком широкими, но может ли кто-нибудь помочь мне понять, требуется ли какая-либо / какая «блокировка» в моем конкретном случае в методе 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
}