我创建了一个包含两个函数的Matlab dll。 Function1运行需要3-4毫秒,而Function2需要大约1秒。我需要在C#中连续运行Function1,在Function2中运行。我经历过,当我运行Function2时,Function1不会连续运行,或者需要的时间超过3-4毫秒(在2-3秒的范围内)。一旦Function2完成,Function1就会返回正常/快速状态。这些是我已经尝试过的:
有没有人对此问题有任何想法/解决方案? Matlab是否在单线程中运行函数/代码?如果没有,无论如何都要为函数指定单独的线程吗?
我感谢任何帮助。
答案 0 :(得分:1)
看起来你的直觉是正确的:即使源自多个线程,也会按顺序执行对Matlab库的调用。请参阅Peter Webb在Creating C++ Shared Libraries and DLLs下的评论:
您可以从多个线程调用库,但任何时候只能在库中激活一个线程。生成的库受信号量保护,信号量一次只允许一个用户线程进入生成的库。尝试调用共享库的其他用户线程将阻塞(等待),直到共享库“空闲”。
[...]
图书馆用信号量保护自己。他们这样做是因为底层执行引擎(MCR)不是线程安全的。这意味着即使你可以禁用信号量,你也不会想要,因为你可能会得到不正确的结果或程序失败。
如果您确实需要并行性,那么目前您最好(也是唯一)的选择是使用单独的进程。如果您的客户端可以使用任何标准Web协议(HTTP或JSON)或Microsoft的专有扩展版本,则使用WCF在单独的进程中设置基于Web的WCF客户端非常简单。 (当然,在这种情况下,您的服务器必须在Windows计算机上运行。)有关详细信息,请参阅my WCF post。