如果锁定发生在API层、应用程序层或两者都发生
本文关键字:两者都 应用程序 API 锁定 如果 | 更新日期: 2023-09-27 18:22:12
作为API设计器,执行锁检查以确保对象状态不会被调用方无效是否有意义?
考虑一个Grid3D
数据结构,每次更改其Width
、Heigth
或Depth
时,都必须调整其自身的大小。如果调用方正在从多个线程修改Grid3D
,则Grid
可能正在调整大小,同时进行新的调整大小尝试,这将使对象状态无效或引发异常。
这可以通过使用锁为resize函数提供互斥来克服,并且它可以发生在API(即Grid3D
的类定义)中,也可以发生在使用Grid3D
的应用程序中。
如果在Grid3D
类定义中锁定是正确的,那么就意味着所有API开发都应该考虑线程同步。在许多情况下(当然还有许多在线示例,包括StackOverflow)不考虑在API级类中进行同步。
那么,执行锁定的正确位置在哪里?在什么情况下API级别应该关注锁定
这是您的设计决策,您可以创建一个线程安全的类,也可以将以线程安全的方式使用它的任务委托给使用它的人。
通常,当不打算在多线程环境中使用类时,库不提供线程安全的类实例。如果类的主要用途是在多线程环境中,则应该处理线程安全性。
你可以在MSDN 中看到这句话一百万次
此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。
这意味着该类的实例在默认情况下不打算在多线程环境中使用,但您也可以看到默认情况下支持内置同步的类,并且可以在多线程的环境中使用。
正如我所看到的,Grid3D
是一个UI组件,通常UI组件是为创建它们的线程所使用而构建的。
这取决于API是否应该是线程安全的。如果是,那么API层应该关注锁定,否则就不应该关注锁定。
以System.Threading.Thread
和System.Array
类为例。Thread
是线程安全的,并且有文档记录(请参阅线程安全部分),而Array
不是线程安全的并且文档中指出其"…任何实例成员都不能保证是线程安全"。