同时从单个 Matlab dll 调用两个函数
本文关键字:两个 函数 调用 单个 Matlab dll | 更新日期: 2023-09-27 18:35:14
我创建了一个包含两个函数的Matlab dll。函数 1 需要 3-4 毫秒才能运行,函数 2 大约需要 1 秒。我需要在 C# 中连续运行函数 1,不时运行函数 2。我经历过当我运行 Function2 时,Function1 不会连续运行,或者需要超过 3-4 毫秒(在 2-3 秒的范围内)。函数 2 完成后,函数 1 将立即返回到正常/快速状态。这些是我已经尝试过的:
- 我在单独的线程中调用了 Function2,但没有运气!(函数 1 也在单独的线程中运行)。
- 我使用后台工作者而不是线程(以防万一),但没有运气!
- 我只为 Function2 创建了一个单独的 dll,再次遇到了同样的问题/延迟/延迟。
有人对这个问题有任何想法/解决方案吗?Matlab 是否在单线程中运行函数/代码?如果没有,是否要为函数指定单独的线程?
我感谢任何帮助。
看起来你的直觉是正确的:对 Matlab 库的调用是按顺序执行的,即使来自多个线程。请参阅 Peter Webb 在创建C++共享库和 DLL 下的评论:
您可以从多个线程调用库,但任何时候库中只能有一个线程处于活动状态。生成的库受信号量保护,信号量在任何时候只允许一个用户线程进入生成的库。尝试调用共享库的其他用户线程将阻止(等待)共享库"空闲"。
[...]
库使用信号量保护自己。它们这样做是因为底层执行引擎 (MCR) 不是线程安全的。这意味着即使您可以禁用信号量,您也不想这样做,因为您可能会得到不正确的结果或程序失败。
如果您确实需要并行性,目前最好的(也是唯一的)选择是使用单独的进程。如果您的客户端可以使用任何标准 Web 协议(HTTP 或 JSON)或Microsoft专有扩展版本,则使用 WCF 在单独的进程中设置基于 Web 的 WCF 客户端非常简单。(当然,在这种情况下,您的服务器必须在 Windows 计算机上运行。有关详细信息,请参阅我的 WCF 帖子。