#c# #c #multithreading #appdomain
#c# #c #многопоточность #appdomain
Вопрос:
У меня есть библиотека C, которая не является потокобезопасной — и, вероятно, никогда не будет. Я вызываю его из C # с помощью PInvoke, и это работает довольно хорошо.
Теперь эта библиотека C должна вызываться из программы на C #, которая, безусловно, является многопоточной. Я могу управлять этим в C #, вызывая каждый экземпляр кода C из отдельных доменов приложений, за исключением того, что, похоже, это работает не очень хорошо. Я все еще получаю много проблем с перекрестными потоками в библиотеке C.
Будут ли домены приложений изолировать беспорядок кода C (глобальные переменные и т. Д.) Друг от друга или нет? Если нет, то что будет?
Комментарии:
1. Можно ли загружать библиотеку несколько раз в C #, как вы можете в C / C , копируя оригинал и динамически загружая его снова? Дешевый, но эффективный способ обойти это!
2. Нет. Похоже, что машинный код, загруженный в один и тот же процесс — независимо от метода — разделяет пространство памяти. Все это должно быть полностью в другом процессе.
Ответ №1:
Нет, домены приложений не помогут. Если вы одновременно вызываете свою библиотеку C, не имеет значения, из какого домена приложения поступают вызовы.
Если библиотека C не является потокобезопасной, вам придется сериализовать доступ к ней. На самом деле, наличие нескольких доменов приложений усложняет задачу — вам придется синхронизировать между доменами.
Ответ №2:
Я думаю, что AppDomains — это конструкция, которая изолирует только управляемый код.
Вам необходимо синхронизировать доступ к вашей библиотеке c с доступными примитивами синхронизации c # / .NET (например, использовать lock
блоки).
Ответ №3:
Если у вас есть глобальные / общие переменные в библиотеке C, и вам нужно их изолировать, вам придется запускать отдельные процессы.