Копался я в коде и задумался об одной вещи. Код ниже — он точно корректен? Нет ли там вероятности, что BackgroundThread получит ссылку на объект, когда внутренности объекта еще не доступны тому потоку, на котором он исполняется? (если считать, что Process и BackgroundThread исполняются на разных ядрах, например)?
class WorkerClass
{
class SomeClass
{
public string SomeField;
}
readonly ConcurrentQueue<SomeClass> _queue = new ConcurrentQueue<SomeClass>();
volatile bool _stop;
public void Process()
{
var thread = new Thread(BackgroundThread);
thread.Start();
for (var i = 0; i < 100; i++)
{
_queue.Enqueue(new SomeClass { SomeField = $"SomeVal{i}" });
}
}
void BackgroundThread()
{
while (!_stop)
{
if (_queue.TryDequeue(out var val))
DoSomething(val);
else
Thread.Sleep(1);
}
}
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>