Pergunta

Descobri através de tentativa e erro que a função do mecanismo MATLAB não é completamente segura.

Alguém conhece as regras?

Descoberto por tentativa e erro:

No Windows, a conexão com o MATLAB é via com, para que as regras de encadeamento do apartamento se aplicam. Todas as chamadas devem ocorrer no mesmo encadeamento, mas várias conexões podem ocorrer em vários threads, desde que cada conexão seja isolada.

A partir das respostas abaixo, parece que esse não é o caso no Unix, onde as chamadas podem ser feitas de vários threads, desde que as chamadas sejam feitas em série.

Foi útil?

Solução

Quando comecei a usar o motor, não encontrei nenhuma documentação sobre segurança do thread, então assumi que ele não era seguro para threads.

Eu uso uma classe C ++ para sincronizar o acesso a uma instância do mecanismo. Para projetos de processamento mais paralelos, instanciei várias instâncias da classe do motor.

(Editar) Estou usando o Matlab R14 no Solaris. Abro o mecanismo usando a chamada 'InGopen' e a fecho usando 'EngClose'. Minha plataforma não trava quando o fechamento é chamado por um encadeamento diferente do que chamado Open.

Outras dicas

De documentação,

As bibliotecas do MATLAB não são seguras de threads. Se você criar aplicativos multithread, verifique se apenas um thread acessa o aplicativo do mecanismo.

Da perspectiva de um usuário, o intérprete do MATLAB é puramente thread único. Para estar seguro, você provavelmente precisa fazer todo o acesso ao motor a partir de um único thread.

Observe que internamente, o Matlab usa muitos threads. Existem threads da GUI e, nas últimas versões, o intérprete pode usar vários threads nos bastidores. Mas, o intérprete é semanticamente equivalente a um intérprete de thread único (com interrupções).

Você pode usar engOpenSingleUse ao invés de usar engOpen Para fazer mais de um tópico funcionando separadamente. (Apenas Windows)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top