2008-10-29 10 views
8

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

¿Alguien conoce las reglas?

Descubierto por ensayo y error:

En Windows, la conexión a MATLAB es a través de COM, por lo que se aplican las reglas COM Apartamento de roscado. 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.

+0

yo sepa MATLAB motor se implementa mediante COM en Windows, y el uso de tuberías en Unix: http://www.mathworks.com/help/matlab/matlab_external/ using-matlab-engine.html – Amro

Respuesta

3

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

Utilizo una clase 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.

(corregir) Estoy utilizando 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.

1

Desde la perspectiva de un 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 utiliza 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).

1

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

6

Desde el documentation,

MATLAB libraries are not thread-safe. If you create multithreaded applications, make sure only one thread accesses the engine application.

Cuestiones relacionadas