c++ matlab thread-safety matlab-engine

c++ - Seguridad de rosca de la API del motor Matlab



thread-safety matlab-engine (4)

Descubrí a través de prueba y error que la función del motor MATLAB no es completamente segura para subprocesos.

¿Alguien conoce las reglas?

Descubierto a través de prueba y error:

En Windows, la conexión a MATLAB es a través de COM, por lo que se aplican las reglas de enhebrado de apartamentos COM. Todas las llamadas deben ocurrir en el mismo subproceso, pero múltiples conexiones pueden ocurrir en múltiples subprocesos siempre que cada conexión esté aislada.

De las respuestas a continuación, parece que este no es el caso en UNIX, donde las llamadas se pueden hacer desde múltiples hilos, siempre y cuando las llamadas se realicen en serie.


Desde la perspectiva del usuario, el intérprete de Matlab tiene un solo hilo. Para estar seguro, probablemente necesite hacer todo el acceso al motor desde un solo hilo.

Tenga en cuenta que internamente, Matlab usa muchos hilos. Hay subprocesos de GUI, y en las últimas versiones, el intérprete puede usar múltiples subprocesos detrás de escena. Pero, el intérprete es semánticamente equivalente a un intérprete de subproceso único (con interrupciones).


Cuando comencé a usar el motor, no encontré ninguna documentación sobre seguridad de subprocesos, así que supuse que no era seguro para subprocesos.

Uso una clase de C ++ para sincronizar el acceso a una instancia del motor. Para más diseños de procesamiento en paralelo, instanciar varias instancias de la clase de motor.

(edit) Estoy usando MATLAB R14 en Solaris. Abro el motor usando la llamada ''engOpen'', y lo cierro usando ''engClose''. Mi plataforma no se cuelga cuando el Close es llamado por un hilo diferente al llamado Open.


De la documentación ,

Las bibliotecas de MATLAB no son seguras para subprocesos. Si crea aplicaciones multiproceso, asegúrese de que solo un hilo acceda a la aplicación del motor.


Puede usar engOpenSingleUse lugar de usar engOpen para hacer que más de un hilo funcione por separado. (Solo Windows)