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

Matlab 解决由于非线程安全API函数而并行发生的分段故障,matlab,thread-safety,segmentation-fault,mex,cplex,Matlab,Thread Safety,Segmentation Fault,Mex,Cplex,我目前正在MATLAB中编写一个MEX文件,以便使用MATLAB 2012a中的parfor函数并行运行实验。MEX文件执行一些非常简单的数值任务,但依赖于IBM的CPLEX 12.4 API 虽然我的MEX文件按顺序工作。在向MATLAB发送分段错误的堆栈跟踪后,他们认为错误源于C库中的“putenv()”函数,这显然不是线程安全的 我在MEX代码中没有使用putenv()函数,但事实证明,我必须从CPLEX 12.4调用的函数之一确实使用了它。我想知道我是否可以做些什么来避免由于这个函数而产

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

虽然我的MEX文件按顺序工作。在向MATLAB发送分段错误的堆栈跟踪后,他们认为错误源于C库中的“putenv()”函数,这显然不是线程安全的

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


如有任何建议或指示,将不胜感激

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


修复方法是使用该包,并在C和MATLAB中使用putenv()的函数周围添加一个mutex_lock/mutex_unlock(即MATLAB中的C/Cplex()中的cpxoppenplex)。有关创建互斥锁/互斥锁解锁的详细信息和确切代码,请访问

呼叫IBM支持人员,并告诉他们修复其lib,以便在2000年后的机器上有效使用?我猜这个库是不透明的,您没有源代码也无法重建它?