chrispdraycott Ответов: 1

МПК между .Объем 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.

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

Спасибо.

1 Ответов

Рейтинг:
0

Jeltz1

Использование байта или двух в общей памяти в качестве переменной для государственной машины, определяющей, какая часть C / .Net получает доступ в какое время, скорее всего, является вашим лучшим вариантом.

Предполагая, что у вас есть многопоточный процессор в вашем распоряжении, нет большой трудности с тем, чтобы код C делал действительно быстрый опрос и в основном жевал ядро процессора полный рабочий день сам по себе с соответствующим сродством процессора/приоритетом процесса.

Если возможно, разделите функциональность между C и .Сеть такова, что вы не всегда идете туда и обратно, меняя состояния на высокой скорости. Стремитесь к тому, чтобы с делал более важные для времени вещи, и т. д.Чистая, более умная, но ленивая уловка как раз вовремя.

Переменная состояния общей памяти может использоваться как угодно под вашим полным контролем - например, имея определенное состояние, в котором C записывает одну часть общей памяти, а другой-другую .Чистая пишет, что другая часть может быть приспособлена. Просто определите несколько состояний/переходов состояний, чтобы предоставить доступ для чтения/записи, который лучше всего подходит вашему приложению!

Затем использовать .Чистая асинхронная задача для опроса переменной состояния в цикле с помощью "await Task.Задержка(nnn) и оператор case для распределения задач для выполнения различных состояний с помощью .Чистая функциональность. Таким образом, вы используете несколько потоков/процессорных ядер, которые .Сеть дает вам по умолчанию. Это должно дать время детализации до 20 миллисекунд или около того.

Если вы смотрите на микросекундный вид взад и вперед между C и .Сеть в общей памяти вам не повезло, я думаю, и вам нужно переосмыслить дизайн кода.