вопрос к гуру lock-free
От: CoderMonkey  
Дата: 31.01.18 18:13
Оценка: :)
Копался я в коде и задумался об одной вещи. Код ниже — он точно корректен? Нет ли там вероятности, что 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.