同时从单个Matlab dll调用两个函数

时间:2014-12-25 19:02:11

标签: c# multithreading matlab

我创建了一个包含两个函数的Matlab dll。 Function1运行需要3-4毫秒,而Function2需要大约1秒。我需要在C#中连续运行Function1,在Function2中运行。我经历过,当我运行Function2时,Function1不会连续运行,或者需要的时间超过3-4毫秒(在2-3秒的范围内)。一旦Function2完成,Function1就会返回正常/快速状态。这些是我已经尝试过的:

  1. 我在一个单独的线程中调用了Function2,没有运气! (Function1也在一个单独的线程中运行。)
  2. 我使用backgroundworker而不是Thread(以防万一),没有运气!
  3. 我为Function2创建了一个单独的dll,并且我再次遇到了相同的问题/延迟/延迟。
  4. 有没有人对此问题有任何想法/解决方案? Matlab是否在单线程中运行函数/代码?如果没有,无论如何都要为函数指定单独的线程吗?

    我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

看起来你的直觉是正确的:即使源自多个线程,也会按顺序执行对Matlab库的调用。请参阅Peter Webb在Creating C++ Shared Libraries and DLLs下的评论:

  
    

您可以从多个线程调用库,但任何时候只能在库中激活一个线程。生成的库受信号量保护,信号量一次只允许一个用户线程进入生成的库。尝试调用共享库的其他用户线程将阻塞(等待),直到共享库“空闲”。

         

[...]

         

图书馆用信号量保护自己。他们这样做是因为底层执行引擎(MCR)不是线程安全的。这意味着即使你可以禁用信号量,你也不会想要,因为你可能会得到不正确的结果或程序失败。

         

如果您确实需要并行性,那么目前您最好(也是唯一)的选择是使用单独的进程。如果您的客户端可以使用任何标准Web协议(HTTP或JSON)或Microsoft的专有扩展版本,则使用WCF在单独的进程中设置基于Web的WCF客户端非常简单。 (当然,在这种情况下,您的服务器必须在Windows计算机上运行。)有关详细信息,请参阅my WCF post