作为API设计者,执行锁定检查以确保调用者不会使对象状态失效是否有意义?
考虑一个Grid3D
数据结构,每次更改Width
,Heigth
或Depth
时,必须自行调整大小。如果调用者正在从多个线程修改Grid3D
,则Grid
可能会在进行新的调整大小时调整大小,这会使对象状态无效或抛出异常。
这可以通过使用锁来为resize函数提供互斥来克服,它可能发生在API中(即Grid3D
的类定义),也可能发生在Grid3D
的应用程序中{使用{1}}。
如果锁定Grid3D
类定义是正确的,那么可以说所有API开发都应该考虑线程同步。在许多情况下(当然很多在线示例包括StackOverflow)不考虑API级别的同步。
那么,执行锁定的正确位置在哪里?在什么条件下API级别应该关注锁定?
答案 0 :(得分:1)
这取决于API是否应该是线程安全的。如果是,那么API层应该关注锁定,否则它不应该。
作为示例,请查看System.Threading.Thread
和System.Array
类。 Thread
是线程安全的,所以它是记录的(参见线程安全部分),而Array
不是线程安全的,并且在文档中注明它的“......任何实例成员都不能保证是线程安全的“。
答案 1 :(得分:1)
这是您的设计决定,您可以创建一个线程安全类,或者您可以将以线程安全方式使用它的任务委派给使用它的人。
通常,当库不打算在多线程环境中使用时,库不提供类的线程安全实例。如果您的类的主要用途是在多线程环境中,则应该处理线程安全性。
您可以在MSDN中看到此报价数百万次
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
这意味着在多线程环境中默认情况下不会使用该类的实例,但默认情况下支持内置同步的can see also classes已准备好在多线程环境中使用。< / p>
正如我所看到的,Grid3D
是一个UI组件,通常UI组件只是由创建它们的线程使用。