Thread safety of Matlab engine API
Asked Answered
R

4

8

I have discovered through trial and error that the MATLAB engine function is not completely thread safe.

Does anyone know the rules?

Discovered through trial and error:

On Windows, the connection to MATLAB is via COM, so the COM Apartment threading rules apply. All calls must occur in the same thread, but multiple connections can occur in multiple threads as long as each connection is isolated.

From the answers below, it seems that this is not the case on UNIX, where calls can be made from multiple threads as long as the calls are made serially.

Reuven answered 29/10, 2008 at 21:8 Comment(1)
afaik MATLAB Engine is implemented using COM on Windows, and using pipes on Unix: mathworks.com/help/matlab/matlab_external/…Oxidate
S
3

When I first started using the engine, I didn't run across any documentation on thread safety, so I assumed that it was not thread-safe.

I use a C++ class to synchronize access to an engine instance. For more parallel processing designs, I instantiate multiple instances of the engine class.

(edit) I'm using MATLAB R14 on Solaris. I open the engine using the 'engOpen' call, and close it using 'engClose'. My platform does not crash when the Close is called by a different thread than the one that called Open.

Spontaneous answered 30/10, 2008 at 20:25 Comment(1)
Your application does not crash because you are accessing the engine on different threads on Solaris. On windows and because of the limitations of COM objects, it will crash.Tamayo
D
7

From the documentation,

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

Doughman answered 16/6, 2010 at 13:46 Comment(0)
S
3

When I first started using the engine, I didn't run across any documentation on thread safety, so I assumed that it was not thread-safe.

I use a C++ class to synchronize access to an engine instance. For more parallel processing designs, I instantiate multiple instances of the engine class.

(edit) I'm using MATLAB R14 on Solaris. I open the engine using the 'engOpen' call, and close it using 'engClose'. My platform does not crash when the Close is called by a different thread than the one that called Open.

Spontaneous answered 30/10, 2008 at 20:25 Comment(1)
Your application does not crash because you are accessing the engine on different threads on Solaris. On windows and because of the limitations of COM objects, it will crash.Tamayo
B
2

From a user's perspective, Matlab's interpreter is purely single-threaded. To be safe, you probably need to make all access to the engine from a single thread.

Note that internally, Matlab uses plenty of threads. There are GUI threads, and in the last few versions, the interpreter can use multiple threads behind the scenes. But, the interpreter is semantically equivalent to a single-threaded interpreter (with interrupts).

Blest answered 29/10, 2008 at 23:13 Comment(0)
C
0

You can use engOpenSingleUse instead of using engOpen to make more than one thread working separately. (Only Windows)

Coir answered 11/11, 2009 at 16:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.