锁定应该发生在 API 层、应用层还是两者?
Should locking occur at API layer, application layer, or both?
作为 API 设计师,执行锁定检查以确保对象状态不会被调用者无效是否有意义?
考虑一个 Grid3D
数据结构,它必须在每次 Width
、Heigth
或 Depth
更改时自行调整大小。如果调用者正在从多个线程修改 Grid3D
,则 Grid
可能会在进行新的调整大小尝试时调整大小,这会使对象状态无效或引发异常。
这可以通过使用锁来为调整大小函数提供互斥来克服,它可能发生在 API 中(即 Grid3D
的 class 定义) ) 或者它可能发生在使用 Grid3D
的应用程序中。
如果在Grid3D
class定义里面加锁是正确的,按理说所有API开发都应该考虑线程同步。在许多情况下(当然有很多在线示例,包括 Whosebug)不考虑 API 级 classes 中的同步。
那么,加锁的正确位置在哪里呢?在什么情况下 API 级别应该关注锁定?
这取决于 API 是否应该是线程安全的。如果是,那么 API 层应该关注锁定,否则不应该。
例如,查看 System.Threading.Thread
和 System.Array
类。 Thread
是线程安全的,它是这样记录的(参见线程安全部分),而 Array
不是线程安全的,并且在文档中指出它的“......任何实例成员都不能保证是线程安全的。
这是您的设计决定,您可以创建一个线程安全的 class 或者您可以将以线程安全的方式使用它的任务委托给使用它的人。
当库不打算用于多线程环境时,它们通常不提供 classes 的线程安全实例。如果您的 class 的主要用途是在多线程环境中,您应该处理线程安全。
您可以在 MSDN 中看到此引用数百万次
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
这意味着 class 的实例不打算在多线程环境中默认使用,但您 can see also classes 默认支持内置同步并准备好在多线程环境中使用多线程环境。
正如我所见,Grid3D
是一个 UI 组件,通常 UI 组件仅供创建它们的线程使用。
作为 API 设计师,执行锁定检查以确保对象状态不会被调用者无效是否有意义?
考虑一个 Grid3D
数据结构,它必须在每次 Width
、Heigth
或 Depth
更改时自行调整大小。如果调用者正在从多个线程修改 Grid3D
,则 Grid
可能会在进行新的调整大小尝试时调整大小,这会使对象状态无效或引发异常。
这可以通过使用锁来为调整大小函数提供互斥来克服,它可能发生在 API 中(即 Grid3D
的 class 定义) ) 或者它可能发生在使用 Grid3D
的应用程序中。
如果在Grid3D
class定义里面加锁是正确的,按理说所有API开发都应该考虑线程同步。在许多情况下(当然有很多在线示例,包括 Whosebug)不考虑 API 级 classes 中的同步。
那么,加锁的正确位置在哪里呢?在什么情况下 API 级别应该关注锁定?
这取决于 API 是否应该是线程安全的。如果是,那么 API 层应该关注锁定,否则不应该。
例如,查看 System.Threading.Thread
和 System.Array
类。 Thread
是线程安全的,它是这样记录的(参见线程安全部分),而 Array
不是线程安全的,并且在文档中指出它的“......任何实例成员都不能保证是线程安全的。
这是您的设计决定,您可以创建一个线程安全的 class 或者您可以将以线程安全的方式使用它的任务委托给使用它的人。
当库不打算用于多线程环境时,它们通常不提供 classes 的线程安全实例。如果您的 class 的主要用途是在多线程环境中,您应该处理线程安全。
您可以在 MSDN 中看到此引用数百万次
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
这意味着 class 的实例不打算在多线程环境中默认使用,但您 can see also classes 默认支持内置同步并准备好在多线程环境中使用多线程环境。
正如我所见,Grid3D
是一个 UI 组件,通常 UI 组件仅供创建它们的线程使用。