MemoryMappedFile и InterlockedIncrement
От: Seneca Россия  
Дата: 08.12.09 14:45
Оценка:
Коллеги, есть вопрос. Я работаю с MemoryMappedFile из управляемого кода.
В начале файла хранится смещение, по которому другие процессы могут записывать свою информацию. Вопрос в том, как обеспечить межпроцессную синхронизацию для значения этого смещения. В неуправляемом коде все просто, я получаю адрес файла, привожу область памяти к int и делаю ему InterlockedIncrement. Но как быть в управлемом коде — не совсем понятно. Буду благодарен за любые советы. Заранее спасибо!
Многоие знания сулят нам многие печали, и умножая знания мы умножаем печаль. (с) Екклезиаст.
Re: MemoryMappedFile и InterlockedIncrement
От: Pavel Dvorkin Россия  
Дата: 09.12.09 08:39
Оценка:
Здравствуйте, Seneca, Вы писали:

S>Коллеги, есть вопрос. Я работаю с MemoryMappedFile из управляемого кода.

S>В начале файла хранится смещение, по которому другие процессы могут записывать свою информацию. Вопрос в том, как обеспечить межпроцессную синхронизацию для значения этого смещения. В неуправляемом коде все просто, я получаю адрес файла, привожу область памяти к int и делаю ему InterlockedIncrement. Но как быть в управлемом коде — не совсем понятно. Буду благодарен за любые советы. Заранее спасибо!

А в чем проблема-то ? Если уж ты вызываешь CreateFileMapping и т.д. через PInvoke, кто мешает вызвать и InterlockedIncrement ?
With best regards
Pavel Dvorkin
Re[2]: MemoryMappedFile и InterlockedIncrement
От: HowardLovekraft  
Дата: 09.12.09 09:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>кто мешает вызвать и InterlockedIncrement ?

Велосипедизм? Interlocked Class.
Re[3]: MemoryMappedFile и InterlockedIncrement
От: Pavel Dvorkin Россия  
Дата: 09.12.09 09:14
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>кто мешает вызвать и InterlockedIncrement ?

HL>Велосипедизм? Interlocked Class.

Если можешь, объясни, как применить этот класс к неуправляемой памяти. Напоминаю

>Я работаю с MemoryMappedFile из управляемого кода. В начале файла хранится смещение, по которому другие процессы могут записывать свою информацию
With best regards
Pavel Dvorkin
Re[4]: MemoryMappedFile и InterlockedIncrement
От: HowardLovekraft  
Дата: 09.12.09 10:24
Оценка: 15 (2)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Если можешь, объясни, как применить этот класс к неуправляемой памяти

Как-то так:
    class Program
    {
        [DllImport("Kernel32.dll")]
        static extern IntPtr GlobalAlloc(uint uFlags, uint dwBytes);

        [DllImport("Kernel32.dll")]
        static extern IntPtr GlobalFree(IntPtr hMem);

        static void Main()
        {
            var ptr = GlobalAlloc(0x0040, 4);
            if (ptr == IntPtr.Zero)
                throw new Win32Exception(Marshal.GetLastWin32Error());
            try
            {
                unsafe
                {
                    Console.WriteLine(Marshal.ReadInt32(ptr));
                    Interlocked.Increment(ref *((int*)ptr));
                    Console.WriteLine(Marshal.ReadInt32(ptr));
                }
            }
            finally
            {
                if (GlobalFree(ptr) != IntPtr.Zero)
                    throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            Console.ReadLine();
        }
    }


В консоль выводит:

0
1

Функции GlobalAlloc и GlobalFree использованы как пример получения указателя на unmanaged memory.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.