编写线程安全s函数的指南
金宝app®允许您使用多线程编程并行运行s函数,这使得模拟运行速度比串行运行更快。使用s函数的多线程编程要求您使s函数线程安全。创建线程安全的代码需要确保多个线程之间共享的数据受到保护,以便数据和结果符合预期。使用非线程安全的s函数进行模拟可能会导致意外行为。
背景
C/ c++函数用C或c++实现,并内置于称为MEX文件的共享库中。当一个s函数块引用一个共享库时,MATLAB®将s函数块加载到进程中。当多个s函数块引用同一个共享库时,它们也引用初始共享库副本。这个过程导致多个s函数块共享共享库拥有的相同数据。因此,多线程s函数块可以同时访问相同的数据。
此外,如果这些s函数引用相同的资源,多线程s函数块可以同时访问相同的资源(如文件),即使s函数块与不同的s函数相关联。
的指导方针
当s函数可以安全地使用多个线程并发执行时,它通常被认为是线程安全的。将s函数指定为线程安全的,使用ssSetRuntimeThreadSafetyCompliance
函数。如果您不确定s函数的线程安全性,请使用这些指导原则来调查并使其线程安全。
数据共享
定义 | 问题 | 解决方案 |
---|---|---|
S-function引用使用指针的数据(例如, |
多个线程可以使用指针访问相同的数据。如果线程试图同时写入相同的内存位置,它们就违反了线程安全。只要在读取之前、期间或之后没有写操作,来自多个线程的并发读取是安全的,否则会导致不一致的缓存。 |
在访问由多个线程共享的数据时要小心。
|
全局变量
定义 | 问题 | 解决方案 |
---|---|---|
全局变量是在整个应用程序中可访问的共享数据。 |
多线程写入不受保护的共享数据是不安全的。只要在读取之前、期间或之后没有写操作,读取就是安全的,否则会导致不连贯的缓存。 |
|
局部静态变量初始化
定义 | 问题 | 解决方案 |
---|---|---|
局部静态变量存储在一个位置。
|
如果多个线程同时进入函数作用域,则软件会多次尝试向同一位置写入。即使局部静态变量是常量,这个问题仍然存在。 |
|
资源
定义 | 问题 | 解决方案 |
---|---|---|
资源是向系统显式请求并返回给系统的实体。资源的一些例子包括动态分配的内存、文件、数据库连接和网络套接字。您的应用程序可能需要管理资源。 |
从多个线程访问资源可能不是线程安全的,例如从多个线程读取和写入文件。即使这些操作是线程安全的,它们也可能不会产生预期的结果。 |
管理资源时要谨慎。资源的线程安全性取决于它的实现。有关线程安全规范的更多信息,请参阅资源文档。您还可以选择使用互斥锁等机制来保护对资源的访问。 |
可重入性
定义 | 问题 | 解决方案 |
---|---|---|
如果从同一个线程(递归地)多次调用一个函数是安全的,那么这个函数就是可重入的。例如, |
从多个线程调用不可重入函数可能不安全。 |
使函数可重入。例如:
|
mexCallMATLAB
定义 | 问题 | 解决方案 |
---|---|---|
s函数可以使用 |
金宝appSimulink代码处理 |
不要打电话 |
无异常代码
定义 | 问题 | 解决方案 |
---|---|---|
只要它的子例程在被调用时没有长跳的可能,s函数就没有异常。有关无异常s函数的更多信息,请参见无异常代码. |
当s函数不是无异常时,它的子例程将通过 |
检查跳远时的s函数。如果没有异常,则使用 如果s -函数抛出异常,但使用try/catch块捕获异常,则该s -函数是安全的。 |
数据竞赛
定义 | 问题 | 解决方案 |
---|---|---|
当应用程序的输出依赖于执行顺序,从而应用程序的行为在执行之间发生变化时,就会发生数据争用。 |
应用程序可能有意外的行为。 |
考虑以下其中一个:
|
挥发性
定义 | 问题 | 解决方案 |
---|---|---|
的 |
应用程序可能会错误地使用 |
不要使用 |
错误状态
定义 | 问题 | 解决方案 |
---|---|---|
S-functions使用 |
|
使用线程安全的 |
另请参阅
ssSetLocalErrorStatus
|ssGetLocalErrorStatus