Ich habe durch Versuch und Irrtum herausgefunden, dass die MATLAB-Engine-Funktion nicht vollständig Thread-sicher ist.
Kennt jemand die Regeln?
Entdeckt durch Versuch und Irrtum:
Unter Windows erfolgt die Verbindung zu MATLAB über COM, sodass die COM Apartment Threading-Regeln gelten. Alle Aufrufe müssen in demselben Thread stattfinden, aber mehrere Verbindungen können in mehreren Threads auftreten, solange jede Verbindung isoliert ist.
Aus den Antworten unten scheint es, dass dies unter UNIX nicht der Fall ist, wo Aufrufe von mehreren Threads ausgeführt werden können, solange die Aufrufe seriell erfolgen.
Als ich anfing, die Engine zu benutzen, bin ich nicht auf eine Dokumentation zur Threadsicherheit gestoßen, daher nahm ich an, dass sie nicht threadsicher war.
Ich verwende eine C ++ - Klasse, um den Zugriff auf eine Engine-Instanz zu synchronisieren. Für mehr parallele Verarbeitungsdesigns instanziiere ich mehrere Instanzen der Engine-Klasse.
(bearbeiten) Ich verwende MATLAB R14 unter Solaris. Ich öffne den Motor mit dem Aufruf 'engOpen' und schließe ihn mit 'engClose'. Meine Plattform stürzt nicht ab, wenn der Close von einem anderen Thread aufgerufen wird als derjenige, der Open aufgerufen hat.
Aus der Dokumentation ,
MATLAB-Bibliotheken sind nicht Thread-sicher. Wenn Sie Multithread erstellen Anwendungen, stellen Sie nur einen sicher Thread greift auf den Motor zu Anwendung.
Aus der Perspektive eines Benutzers ist der Matlab-Interpreter rein single-threaded. Um sicherzugehen, müssen Sie wahrscheinlich alle Zugriffe auf die Engine über einen einzigen Thread ausführen.
Beachten Sie, dass Matlab intern viele Threads verwendet. Es gibt GUI-Threads, und in den letzten Versionen kann der Interpreter mehrere Threads hinter den Kulissen verwenden. Aber der Interpreter ist semantisch äquivalent zu einem single-threaded Interpreter (mit Interrupts).
Tags und Links c++ thread-safety matlab matlab-engine