31.01.2018 вопрос к гуру lock-free
 
Копался я в коде и задумался об одной вещи. Код ниже — он точно корректен? Нет ли там вероятности, что 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>>

 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
22.01  PDF to Image