Работа с ошибками сегментации, которые возникают параллельно из-за небезопасной функции API

В настоящее время я кодирую файл MEX в MATLAB для параллельного запуска экспериментов с использованием функции parfor в MATLAB 2012a. Файл MEX выполняет некоторые очень простые числовые задачи, но полагается на API CPLEX 12.4 от IBM.

Хотя мой файл MEX работает последовательно, я неизбежно получу "случайную" ошибку сегментации когда работаю параллельно. После отправки трассировки стека ошибки сегментации в MATLAB они предположили, что ошибка возникает из-за функции «putenv ()» из библиотеки C, которая, по-видимому, не является потокобезопасной.

Я не использую функцию putenv () в моем MEX-коде, но оказалось, что одна из функций, которые мне абсолютно необходимо вызывать из CPLEX 12.4, действительно использует ее. Мне интересно, могу ли я что-нибудь сделать, чтобы избежать ошибок сегментации, возникающих в результате этой функции. Кто-то ранее предлагал «блокировать мои биты» и «использовать семафоры», но я действительно немного не в себе, когда дело касается этих концепций.

Мы будем очень благодарны за любой совет или направление.


person Berk U.    schedule 20.04.2012    source источник
comment
Позвонить в службу поддержки IBM и сказать им, чтобы они исправили свою библиотеку, чтобы ее можно было эффективно использовать на машинах после 2000 года? Я предполагаю, что библиотека непрозрачная, у вас нет исходного кода и вы не можете его пересобрать?   -  person Martin James    schedule 20.04.2012


Ответы (1)


Оказывается, нарушение происходит, поскольку я использую CPLEX MATLAB API в моем коде MATLAB и CPLEX C API в моем MEX-коде одновременно. Оба API используют функцию putenv (), которая не является потокобезопасной. В частности, сбой происходит всякий раз, когда два потока пытаются использовать функцию putenv () одновременно (либо в файле MEX, либо в коде MATLAB).

Исправление заключается в использовании пакета и добавлении mutex_lock / mutex_unlock вокруг функций, которые используют putenv () в C и MATLAB (то есть CPXopenCPLEX в C / Cplex () в MATLAB). Дополнительную информацию и точный код для создания mutex_lock / mutex_unlock можно найти в следующий пост на форумах CPLEX

person Berk U.    schedule 27.04.2012