如果锁定发生在API层、应用程序层或两者都发生

本文关键字:两者都 应用程序 API 锁定 如果 | 更新日期: 2023-09-27 18:22:12

作为API设计器,执行锁检查以确保对象状态不会被调用方无效是否有意义?

考虑一个Grid3D数据结构,每次更改其WidthHeigthDepth时,都必须调整其自身的大小。如果调用方正在从多个线程修改Grid3D,则Grid可能正在调整大小,同时进行新的调整大小尝试,这将使对象状态无效或引发异常。

这可以通过使用锁为resize函数提供互斥来克服,并且它可以发生在API(即Grid3D的类定义)中,也可以发生在使用Grid3D的应用程序中。

如果在Grid3D类定义中锁定是正确的,那么就意味着所有API开发都应该考虑线程同步。在许多情况下(当然还有许多在线示例,包括StackOverflow)不考虑在API级类中进行同步。

那么,执行锁定的正确位置在哪里?在什么情况下API级别应该关注锁定

如果锁定发生在API层、应用程序层或两者都发生

这是您的设计决策,您可以创建一个线程安全的类,也可以将以线程安全的方式使用它的任务委托给使用它的人。

通常,当不打算在多线程环境中使用类时,库不提供线程安全的类实例。如果类的主要用途是在多线程环境中,则应该处理线程安全性。

你可以在MSDN 中看到这句话一百万次

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。

这意味着该类的实例在默认情况下不打算在多线程环境中使用,但您也可以看到默认情况下支持内置同步的类,并且可以在多线程的环境中使用。

正如我所看到的,Grid3D是一个UI组件,通常UI组件是为创建它们的线程所使用而构建的。

这取决于API是否应该是线程安全的。如果是,那么API层应该关注锁定,否则就不应该关注锁定。

System.Threading.ThreadSystem.Array类为例。Thread是线程安全的,并且有文档记录(请参阅线程安全部分),而Array不是线程安全的并且文档中指出其"…任何实例成员都不能保证是线程安全"。

相关文章: