volatile чтение / запись в C # (DotNet Core) для указателей - PullRequest
0 голосов
/ 18 января 2019

Платформа: DotNet Core 2 в Linux

Является ли разыменование указателя C # изменчивым или как сделать его изменчивым?

Наша команда работает над некоторыми безумными вещами, требующими сверхнизкой задержки, но все же должны быть написаны на C #. Нам нужно получить значение из разделяемой памяти с минимальной задержкой, насколько это возможно, и мы будем ждать этого. Таким образом, указатель на разделяемую память - самый быстрый способ, которым я мог представить. Но на самом деле забота о JIT попытается кешировать значение.

Я думаю, что Volatile.Read (IntPtr) может сделать эту работу, но кажется, что IntPtr является неизменным объектом, поэтому приложение будет создавать много мусора, если мы будем продолжать выделять новые.

Спасибо @Eric указал, что это не создает мусор. Но мой вопрос все еще там. Подойдет ли Volatile.Read (IntPtr) или нет? Поскольку IntPtr не является энергозависимым, но значение, на которое он указывает, равно.

Также есть ли шанс использовать функцию сравнения и замены для указателя?

 unsafe
        {
             var access = MemoryMappedFile.CreateFromFile("Test.mem");
            IntPtr ptr = access.SafeMemoryMappedFileHandle.DangerousGetHandle();
             int* p = (int*)ptr.ToPointer();
             p++; //How to get value of this p, if the memory will be updated by another process.

        }

1 Ответ

0 голосов
/ 18 января 2019
Volatile.Read(ref *p);

Пример

Но вы должны гарантировать, что адрес выровнен по 4 байта. В противном случае чтение не будет атомарным.

...