Инструкции для записи ориентированных на многопотоковое исполнение S-функций

Simulink® позволяет вам запустить S-функции параллельно с многопоточным программированием, которое делает симуляции запущенными более быстро, чем последовательные запуски. Многопоточное программирование с S-функциями требует, чтобы вы сделали S-функции ориентированными на многопотоковое исполнение. Создание ориентированного на многопотоковое исполнение кода включает обеспечение, что данные, совместно использованные несколькими потоками, защищены так, чтобы данные и результаты были как ожидалось. Симуляция с S-функциями, которые не являются ориентированной на многопотоковое исполнение силой, вызывает неожиданное поведение.

Фон

S-функции C/C++ реализованы в C или C++ и встроены в разделяемые библиотеки, известные как файлы MEX. Когда Блок s-function относится к разделяемой библиотеке, MATLAB® загружает Блок s-function в процесс. То, когда несколько Блоков s-function относятся к той же разделяемой библиотеке, они также обращаются к начальной букве, совместно использовало копию библиотеки. Этот процесс приводит к нескольким Блокам s-function, совместно использующим те же данные, принадлежавшие разделяемой библиотеке. Таким образом многопоточные Блоки s-function получают доступ к тем же данным одновременно.

Кроме того, если эти S-функции относятся к тем же ресурсам, многопоточные Блоки s-function могут получить доступ к тем же ресурсам (таким как файлы) одновременно, даже когда Блоки s-function сопоставлены с различными S-функциями.

Направляющие линии

S-функция обычно рассматривается ориентированной на многопотоковое исполнение, когда она может безопасно выполнить одновременно использование нескольких потоков. Чтобы определять S-функцию как ориентированную на многопотоковое исполнение, используйте ssSetRuntimeThreadSafetyCompliance функция. Если вы не уверены в потокобезопасности своей S-функции, используйте эти инструкции, чтобы исследовать и сделать его ориентированным на многопотоковое исполнение.

Доля данных

ОпределениеПроблемаРешение

S-функция относится к данным с помощью указателей (например, ssSetUserData, ssGetUserData, ssSetPWorkValue и ssGetPWorkValue). S-функция легко осуществляет обмен данными с помощью этих указателей.

Несколько потоков могут использовать указатели, чтобы получить доступ к тем же данным. Если потоки пытаются записать в ту же ячейку памяти одновременно, они нарушают потокобезопасность. Параллельные чтения от нескольких потоков безопасны, пока нет никаких записей прежде, во время, или после чтений, которые могут вызвать несвязные кэши.

Будьте осторожны при доступе к данным, совместно использованным несколькими потоками.

  • Сделайте данные постоянными, если это только для чтения.

  • Чтобы управлять доступом к данным, рассмотрите использование взаимных исключений. Взаимные исключения могут также гарантировать когерентность кэша.

Глобальные переменные

ОпределениеПроблемаРешение

Глобальные переменные осуществляются обмен данными доступные в приложении.

Несколько потоков, пишущих в незащищенные разделяемые данные, не безопасны. Чтение безопасно, пока нет никаких записей прежде, во время, или после чтений, которые могут вызвать несвязные кэши.

  • Если вы пишете в глобальные данные, локализуете их, управляете доступом к ним с помощью взаимных исключений или изменяете семантику алгоритма. Чтобы гарантировать когерентность кэша, также рассмотрите использование заборов памяти такой как атомарных или взаимное исключение.

  • Если вы читаете, сделайте свою глобальную переменную постоянной.

Локальная инициализация статических переменных

ОпределениеПроблемаРешение

Локальные статические переменные хранятся в одном месте.

  • На C++ локальные статические переменные инициализируются после ввода функционального осциллографа и не ориентированы на многопотоковое исполнение.

  • В C локальные статические переменные инициализируются в начале приложения, пока значение справа от присвоения (значение, присваиваемое в переменную), является постоянным временем компиляции. Эти переменные ориентированы на многопотоковое исполнение.

Если несколько потоков вводят функциональный осциллограф одновременно, программное обеспечение предпринимает несколько попыток записать в то же местоположение. Эта проблема содержит, даже если локальная статическая переменная является постоянной.

  • Если вы используете версию C++ до C++ 11, защищаете инициализацию локальной статической переменной с помощью взаимного исключения или ориентированного на многопотоковое исполнение механизма инициализации, такого как std::call_once или boost::call_once.

  • Если вы будете использовать C++ 11 или позже, локальная инициализация статической переменной, как гарантируют, будет ориентирована на многопотоковое исполнение.

Ресурсы

ОпределениеПроблемаРешение

Ресурсы являются сущностями, от которых явным образом требуют и возвращают в систему. Некоторые примеры ресурсов включают динамически выделенную память, файлы, соединения с базой данных и сетевые сокеты. Ваше приложение может должно быть управлять ресурсами.

Доступ к ресурсам от нескольких потоков не может быть ориентирован на многопотоковое исполнение, таков как чтение и запись в файл от нескольких потоков. Даже если эти операции ориентированы на многопотоковое исполнение, они не могут произвести ожидаемые результаты.

Будьте осторожны когда управление ресурс. Потокобезопасность ресурса зависит от своей реализации. Для получения дополнительной информации о технических требованиях потокобезопасности, см. документацию ресурса. Опционально, можно охранять доступ к ресурсу с помощью механизма, такого как взаимное исключение.

Повторная входимость

ОпределениеПроблемаРешение

Функция повторно используема, если безопасно вызвать многократно от того же потока (рекурсивно). Например, strtok функция не повторно используема, потому что она сохраняет некоторое внутреннее состояние строки, которая будет маркироваться. Функция повторно используема, если она не вызывает неповторно используемые функции.

Вызывание неповторно используемой функции от нескольких потоков не может быть безопасным.

Сделайте свою функцию повторно используемой. Например:

  • Устраните состояния, которые содержит функция.

  • Замените неповторно используемые вызовы функций на повторно используемые эквиваленты. Например, замена strtok с strtok_r.

mexCallMATLAB

ОпределениеПроблемаРешение

S-функция может вызвать MATLAB с помощью mexCallMATLAB функция.

Код Simulink, который обрабатывает mexCallMATLAB функциональность не ориентирована на многопотоковое исполнение.

Не вызывать mexCallMATLAB в вашей S-функции.

Исключение свободный код

ОпределениеПроблемаРешение

S-функция является исключением, свободным, пока ни одна из его стандартных подпрограмм, когда названо, не имеет потенциал долгого перехода. Для получения дополнительной информации об исключении свободные S-функции, смотрите Исключение Свободный Код.

Когда S-функция не является свободным исключением, его стандартные подпрограммы косвенно называются через mexCallMATLAB, который не ориентирован на многопотоковое исполнение (см. mexCallMATLAB).

Исследуйте свою S-функцию на прыжки в длину. Если нет ни одного, не отмечает S-функцию как исключение свободное использование ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE) функция. Если прыжки в длину S-функции несмотря на этот флаг, непредсказуемое поведение происходит.

Если S-функция выдает исключение, но использует блок попытки/выгоды, чтобы отловить исключение, что S-функция безопасна.

Гонка данных

ОпределениеПроблемаРешение

Гонка данных происходит, когда выход вашего приложения зависит от порядка выполнения, таким образом что поведение ваших изменений приложений между выполнением.

Приложение может иметь неожиданное поведение.

Рассмотрите одно из следующего:

  • Пересмотрите свой алгоритм, чтобы устранить гонки данных.

  • Используйте блокировки, чтобы управлять порядком выполнения в критических частях вашего кода или сделать критические операции атомарными.

Энергозависимый

ОпределениеПроблемаРешение

volatile ключевое слово говорит компилятору не оптимизировать переменную, потому что ее значение может быть изменено некоторым механизмом, о котором не знает компилятор.

Приложения могут по ошибке использовать volatile достигнуть потокобезопасности. volatile не обеспечивает атомарность или синхронизацию среди потоков.

Не используйте volatile ключевое слово для потокобезопасности.

Ошибочное состояние

ОпределениеПроблемаРешение

Использование S-функций ssSetErrorStatus, ssGetErrorStatus, ssSetLocalErrorStatus, и ssGetLocalErrorStatus к ошибочному состоянию доступа.

ssSetErrorStatus и ssGetErrorStatus не ориентированы на многопотоковое исполнение. Эти функции могут перезаписать существующие ошибки и создание отчетов причины неточных ошибок. Например, Блок A может сообщить об ошибке, выданной Блоком B.

Используйте ориентированное на многопотоковое исполнение ssSetLocalErrorStatus, и ssGetLocalErrorStatus функции. Не использовать ssSetErrorStatus и ssGetErrorStatus.

Смотрите также

|

Похожие темы