解决由于非线程安全的API函数而并行发生的分段错误

时间:2012-04-20 04:43:52

标签: matlab thread-safety segmentation-fault mex cplex

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

虽然我的MEX文件按顺序工作,I will inevitably receive "random" segmentation fault when I run in in parallel。在将分段错误的堆栈跟踪发送到MATLAB之后,他们建议错误源自C库中的“putenv()”函数,这显然不是线程安全的。

我没有在我的MEX代码中使用putenv()函数,但事实证明我必须从CPLEX 12.4调用的函数之一确实使用它。我想知道我能做些什么来避免由于这个功能而产生的分段错误。有人之前建议“锁定我的位”和“使用信号量”,但是当涉及到这些概念时,我真的很不高兴。

非常感谢任何建议或指示。

1 个答案:

答案 0 :(得分:0)

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

修复是使用包并在C和MATLAB中使用putenv()的函数周围添加一个mutex_lock / mutex_unlock(即MATLAB中的C / Cplex()中的CPXopenCPLEX)。有关创建mutex_lock / mutex_unlock的更多信息和确切代码,请参阅following post on the CPLEX forums