Simulink ® позволяет выполнять S-функции параллельно с многопоточным программированием, что делает моделирование более быстрым, чем последовательные запуски. Многопоточное программирование с использованием S-функций требует от вас обеспечения безопасности потока S-функций. Создание кода, защищенного от потоков, требует обеспечения защиты данных, совместно используемых несколькими потоками, с тем чтобы данные и результаты были такими, как ожидалось. Моделирование с S-функциями, не защищенными от потоков, может привести к неожиданному поведению.
C/C + + S-функции реализованы в C или C++ и встроены в общие библиотеки, известные как MEX-файлы. Когда блок S-функции относится к общей библиотеке, MATLAB ® загружает блок S-функции в процесс. Когда несколько S-функциональных блоков ссылаются на одну и ту же общую библиотеку, они также ссылаются на исходную копию общей библиотеки. Таким образом, многопоточные S-функциональные блоки одновременно получают доступ к одним и тем же данным .
Кроме того, если эти S-функции относятся к одним и тем же ресурсам, многопоточные S-функциональные блоки могут одновременно обращаться к одним и тем же ресурсам (например, к файлам), даже когда S-функциональные блоки связаны с различными S-функциями.
S-функция обычно считается защищенной от потоков, когда она может безопасно выполняться одновременно с использованием нескольких потоков. Чтобы обозначить S-функцию как защищенную от потоков, используйте ssSetRuntimeThreadSafetyCompliance функция. Если вы не уверены в безопасности потока для вашей S-функции, используйте эти рекомендации для изучения и обеспечения безопасности потока.
Общий доступ к данным
| Определение | Проблема | Решение |
|---|---|---|
S-функция относится к данным с помощью указателей (например, | Несколько потоков могут использовать указатели для доступа к одним и тем же данным. Если потоки одновременно пытаются выполнить запись в одну и ту же ячейку памяти, это нарушает безопасность потоков. Одновременные чтения из нескольких потоков безопасны, если нет записей до, во время или после чтения, что может вызвать некогерентные кэши. | Будьте осторожны при доступе к данным, совместно используемым несколькими потоками.
|
Глобальные переменные
| Определение | Проблема | Решение |
|---|---|---|
Глобальные переменные являются общими данными, доступными во всем приложении. | Запись нескольких потоков в незащищенные общие данные небезопасна. Чтение безопасно, если нет записей до, во время или после чтения, что может вызвать некогерентные кэшы. |
|
Инициализация локальных статических переменных
| Определение | Проблема | Решение |
|---|---|---|
Локальные статические переменные хранятся в одном месте.
| Если несколько потоков входят в область функции одновременно, программное обеспечение предпринимает несколько попыток записи в одно и то же местоположение. Эта проблема сохраняется, даже если локальная статическая переменная является постоянной. |
|
Ресурсы
| Определение | Проблема | Решение |
|---|---|---|
Ресурсы - это объекты, которые явно запрашиваются и возвращаются в систему. Некоторые примеры ресурсов включают динамически выделяемую память, файлы, подключения к базе данных и сетевые сокеты. Возможно, приложению потребуется управлять ресурсами. | Доступ к ресурсам из нескольких потоков может быть небезопасным, например чтение и запись в файл из нескольких потоков. Даже если эти операции безопасны для потоков, они могут не дать ожидаемых результатов. | Будьте осторожны при управлении ресурсом. Безопасность потоков ресурса зависит от его реализации. Дополнительные сведения о спецификациях безопасности потоков см. в документации по ресурсам. Дополнительно можно защитить доступ к ресурсу с помощью механизма, такого как мьютекс. |
Повторная входимость
| Определение | Проблема | Решение |
|---|---|---|
Функция повторно вводится, если безопасно вызывать несколько раз из одного потока (рекурсивно). Например, | Вызов неназначенной функции из нескольких потоков может оказаться небезопасным. | Сделайте свою функцию новой. Например:
|
mexCallMATLAB
| Определение | Проблема | Решение |
|---|---|---|
S-функция может вызвать MATLAB с помощью | Код симулятора, который обрабатывает | Не звонить |
Свободный код исключения
| Определение | Проблема | Решение |
|---|---|---|
S-функция свободна от исключений до тех пор, пока ни одна из ее подпрограмм, при ее вызове, не обладает потенциалом прыжков в длину. Дополнительные сведения о свободных от исключений S-функциях см. в разделе Свободный от исключений код. | Когда S-функция не является свободной от исключений, ее подпрограммы косвенно вызываются через | Проверьте свою S-функцию на наличие прыжков в длину. Если их нет, пометьте S-функцию как свободное исключение с помощью Если S-функция создает исключение, но использует блок try/catch для обнаружения исключения, то эта S-функция является безопасной. |
Гонка данных
| Определение | Проблема | Решение |
|---|---|---|
Гонка данных происходит, когда выходные данные приложения зависят от порядка выполнения, так что поведение приложения изменяется между выполнением. | Возможно, приложение ведет себя непредвиденно. | Рассмотрим один из следующих вариантов:
|
Изменчивый
| Определение | Проблема | Решение |
|---|---|---|
| Приложения могут использовать по ошибке | Не используйте |
Состояние ошибки
| Определение | Проблема | Решение |
|---|---|---|
Использование S-функций |
| Использовать защиту от потоков |
ssGetLocalErrorStatus | ssSetLocalErrorStatus