2012-04-20 4 views
0

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

Хотя мой файл MEX работает последовательно, I will inevitably receive "random" segmentation fault when I run in in parallel. После отправки трассировки стека ошибки сегментации в MATLAB они предположили, что ошибка исходит из функции «putenv()» из библиотеки C, которая, по-видимому, не является потокобезопасной.

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

Любые советы или направления были бы очень оценены.

+1

Позвоните в службу поддержки IBM и сообщите им, чтобы исправить их lib, чтобы он эффективно использовался на компьютерах после 2000 года? Я предполагаю, что библиотека непрозрачна, у вас нет исходного кода и невозможно ее перестроить? –

ответ

0

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

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