Nano Hash - криптовалюты, майнинг, программирование

Разделение памяти между управляемым и неуправляемым кодом с помощью P/Invoke

Я создал оболочку C для библиотеки C++ и вызываю эту оболочку C из своего управляемого кода C#. Проблема, с которой я столкнулся, заключается в том, что эта библиотека включает в себя тысячи итераций и длительное время выполнения. Очевидно, мне нужен способ связи с программой C# и обновления состояния обработки, выполняемой библиотекой C/C++.

Прямой подход будет возвращаться после фиксированного количества итераций, обновлять статус и снова вызывать оболочку C/C++. Но обработка зависит от некоторых структур данных на основе C++ STL, которые обновляются после каждой итерации. Мне не нужны эти структуры данных в моем управляемом коде, но очевидно, что они должны храниться в памяти для всех итераций.

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

Я думаю, что лучшим подходом было бы совместное использование некоторых переменных между управляемым и неуправляемым кодом и чтение статуса обработки каждые N итераций. Но это приводит к другой проблеме: как мне синхронизировать доступ к этой памяти?

02.11.2014

  • Почему структуры данных будут освобождены, когда оболочка вернется? 03.11.2014
  • Потому что они выделяются вызываемой функцией. Использование глобальных переменных или невысвобожденной динамической памяти кажется грязным и нестабильным решением. Могу ли я быть уверен, что эта динамическая память или глобальные переменные не будут очищены после вызова обёртки? Что делать, если DLL выгружена? 03.11.2014

Ответы:


1

Вы можете зарегистрировать делегат C# в качестве обратного вызова в коде C++. Таким образом, вам не нужно возвращаться из вашей оболочки, но ваша оболочка может вызвать делегата C# через обратный вызов, а затем продолжить обработку. Ваш делегат также может содержать некоторые параметры, которые вы можете использовать для обмена данными между вашим уровнем C# и уровнем C++.

См. более полное описание здесь.

Главный трюк здесь заключается в использовании метода GetFunctionPointerForDelegate, который позволяет создать Указатель функции C++ из вашего делегата C#, чтобы вы могли вызывать свой код C# из своего уровня C++.

02.11.2014
  • Это не требует хитрости, маршаллер pinvoke уже использует GFPFD для маршалинга делегата. 03.11.2014
  • Спасибо. Поскольку я новичок в P/Invoke, я понятия не имел об этой функции. Кажется, это лучший подход для реализации обновлений статуса. 03.11.2014
  • @ Ханс Пассант. Спасибо, приятно знать, в прошлый раз я использовал его только в обертке C++/CLI. 03.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..