МПК между .Объем 5 просмотр и родных приложений на языке C в Linux - синхронизация
I am looking at IPC between .NET and C on Linux. I have managed to get some shared memory working using: C shm_open and mmap C# MemoryMappedFile I need a mechanism though to be able to synchronize the changes between my .NET application and the C application and i cannot find a way to have a shared lock mechanism. I have looked at named semaphores (but this is not supported on linux in .NET). I have looked at named Mutex (but this is not supported in C on linux). I have looked at creating a shared memory area for a phtread_mutex_t object in C on linux which works but i have no way to map that to anything in the .NET environment. Does anyone know of a way I can do this or maybe get the pthread_mutex_t method working?
Что я уже пробовал:
Пробовал Именованные Семафоры
Попробовал Именованный Мьютекс
Попробовал sharememory для pthread_mutex_t
Afzaal Ahmad Zeeshan
Хотя крайне маловероятно, что Microsoft будет поддерживать или предоставлять поддержку C или чего-то подобного COM и т. д. В настоящее время основное внимание уделяется "получению-вещей-сделано". Кроме того, .NET 5 все еще находится в предварительном просмотре, поэтому несколько библиотек/пакетов не будут доступны для использования, а это означает, что большая часть связанной с .NET работы, которая помогает в этой области, не работает.
Вы пробовали создать мост между именованным семафором/именованным мьютексом? :-)
chrispdraycott
Если вы думаете, что .NET 5 имеет ограничения, которые еще не реализованы, то я с удовольствием изучу и .NET Core 3.1.
Не совсем уверен, что вы подразумеваете под мостом, но в мире C я могу иметь именованный общий мьютекс в общей памяти, но я не знаю, как получить доступ к нему в качестве механизма синхронизации в .NET.
Garth J Lancaster
Задумывались ли вы о том, чтобы опросить общую память на предмет "сигнатуры" или "идентификатора последовательности" в начале блока или, возможно, использовать канал между двумя процессами в качестве механизма "сигнализации"?
Единственные другие мысли, которые у меня были, вероятно, "слишком тяжелые", использовать небольшой протокол сообщений между двумя системами - ZeroMQ, например (не RabbitMQ)
chrispdraycott
Спасибо за ваши предложения.
Да, я посмотрел на значение в начале общей памяти для указания того, записывается ли один процесс в память, но затем вы попадаете в то, как вы ждете доступа и гарантируете, что получите доступ правильно. Например, если один процесс обновляет общую память каждую секунду, он будет поддерживать значение активным довольно часто, и поэтому вам нужно будет опрашивать/проверять значение в другом процессе с высокой частотой, чтобы убедиться, что вы попадете туда, чтобы изменить его. Это возможно, но не идеально.
Я удивлен, что об этом не думали в мире linux. Это не было бы проблемой на windows, что неудивительно!! Конечно, должно быть требование для низкоуровневых приложений, написанных на c/c++, которые должны взаимодействовать с высокоуровневыми приложениями, встроенными в .NET.
Причина, по которой я хочу использовать общую память, - это скорость. Я не хочу использовать сокеты или передавать данные в приложения и из них. Так что не хочу слишком тяжелого веса.
Спасибо.