0

我目前正在 MATLAB 中编写一个 MEX 文件,以使用 MATLAB 2012a 中的 parfor 函数并行运行实验。MEX 文件执行一些非常简单的数字任务,但依赖于 IBM 的 CPLEX 12.4 API。

虽然我的 MEX 文件是按顺序运行的,但当我并行运行时,我不可避免地会收到“随机”分段错误。在将分段错误的堆栈跟踪发送到 MATLAB 后,他们建议错误源自 C 库中的“putenv()”函数,这显然不是线程安全的。

我没有在 MEX 代码中使用 putenv() 函数,但事实证明,我绝对必须从 CPLEX 12.4 调用的函数之一确实使用了它。我想知道是否有什么办法可以避免此功能导致的分段错误。以前有人建议“锁定我的位”和“使用信号量”,但当谈到这些概念时,我真的有点不知所措。

任何建议或方向将不胜感激。

4

1 回答 1

0

事实证明,由于我同时在我的 MATLAB 代码中使用 CPLEX MATLAB API 和在我的 MEX 代码中使用 CPLEX C API,因此发生了违规。这两个 API 都使用 putenv() 函数,该函数不是线程安全的。特别是,只要两个线程尝试同时使用 putenv() 函数(在 MEX 文件或 MATLAB 代码中),就会发生崩溃。

解决方法是使用该包并在 C 和 MATLAB 中使用 putenv() 的函数周围添加一个 mutex_lock / mutex_unlock(即 CPXopenCPLEX in C / Cplex() in MATLAB)。可以在CPLEX 论坛上的以下帖子中找到更多信息和创建 mutex_lock / mutex_unlock 的确切代码

于 2012-04-27T15:30:38.030 回答