Я поддерживаю довольно большое приложение, состоящее из графического интерфейса Java и движка C ++. Два компонента в настоящее время тесно связаны - пользовательский интерфейс загружает движок в виде библиотеки и передает объекты сообщений с помощью JNI. Я думаю о том, чтобы разбить движок как собственный процесс, который предоставит API для любого приложения, к которому можно подключиться через сокет (всегда только 1 клиент на 1 сервер).
В обычном случае запуск приложения будет состоять из:
- GUI находит неиспользуемый порт XXXX, порождает подпроцесс Engine с портом XXXX в качестве параметра
- Двигатель открывает прослушивающее гнездо на порту XXXX
- GUI подключается к порту XXXX
- GUI-Engine подключен через некоторый произвольно пронумерованный порт, и можно закрыть сокет сервера XXXX.
Но что-то кажется не совсем правильным - существует состояние гонки, при котором два приложения, запускающиеся одновременно, могут выбрать один и тот же неиспользуемый порт (перед тем, как запустить свои подпроцессы). Я могу обойти это, но это заставляет меня задаться вопросом, есть ли у меня какое-то базовое неправильное понимание отношений и / или как должно быть установлено соединение?
Спасибо!