Потокобезопасность API движка Matlab
-
05-07-2019 - |
Вопрос
Я методом проб и ошибок обнаружил, что функция движка MATLAB не является полностью поточно-ориентированной.
Кто-нибудь знает правила?
Обнаружено методом проб и ошибок:
В Windows подключение к MATLAB осуществляется через COM, поэтому применяются правила потоков в COM-квартире. Все вызовы должны происходить в одном потоке, но несколько соединений могут происходить в нескольких потоках, если каждое соединение изолировано.
Из приведенных ниже ответов видно, что это не относится к UNIX, где вызовы могут выполняться из нескольких потоков, если вызовы выполняются последовательно.
Решение
Когда я впервые начал использовать движок, я не сталкивался с какой-либо документацией по безопасности потоков, поэтому предположил, что она не безопасна для потоков.
Я использую класс C ++ для синхронизации доступа к экземпляру движка. Для более параллельной обработки проектов я создаю несколько экземпляров класса механизма.
(правка) Я использую MATLAB R14 в Solaris. Я открываю движок с помощью вызова engOpen и закрываю его с помощью engClose. Моя платформа не падает, когда Close вызывается другим потоком, чем тот, который вызвал Open.
Другие советы
Из документации ,
Библиотеки MATLAB не являются поточно-ориентированными. Если вы создаете многопоточный приложения, убедитесь, что только один нить получает доступ к двигателю приложение.
С точки зрения пользователя, интерпретатор Matlab является чисто однопоточным. Чтобы быть в безопасности, вам, вероятно, нужно сделать весь доступ к движку из одного потока.
Обратите внимание, что внутри Matlab использует множество потоков. Существуют потоки GUI, и в последних нескольких версиях интерпретатор может использовать несколько потоков за кулисами. Но интерпретатор семантически эквивалентен однопоточному интерпретатору (с прерываниями).
Вы можете использовать engOpenSingleUse
вместо engOpen
, чтобы несколько потоков работали отдельно. (Только Windows)