应该在API层,应用程序层还是两者都发生锁定?

时间:2015-11-17 15:27:20

标签: c# .net multithreading thread-safety locking

作为API设计者,执行锁定检查以确保调用者不会使对象状态失效是否有意义?

考虑一个Grid3D数据结构,每次更改WidthHeigthDepth时,必须自行调整大小。如果调用者正在从多个线程修改Grid3D,则Grid可能会在进行新的调整大小时调整大小,这会使对象状态无效或抛出异常。

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

如果锁定Grid3D类定义是正确的,那么可以说所有API开发都应该考虑线程同步。在许多情况下(当然很多在线示例包括StackOverflow)不考虑API级别的同步。

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

2 个答案:

答案 0 :(得分:1)

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

作为示例,请查看System.Threading.ThreadSystem.Array类。 Thread是线程安全的,所以它是记录的(参见线程安全部分),而Array不是线程安全的,并且在文档中注明它的“......任何实例成员都不能保证是线程安全的“。

答案 1 :(得分:1)

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

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

您可以在MSDN中看到此报价数百万次

  

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

这意味着在多线程环境中默认情况下不会使用该类的实例,但默认情况下支持内置同步的can see also classes已准备好在多线程环境中使用。< / p>

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