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