注意 Visual Basic COM 对象中的全局变量






3.71/5 (7投票s)
2000年2月18日

81284
关于 Apartment 线程 VB COM 对象中全局变量的 C++ 程序员注意事项。
我主要是一名C++开发者,一年前才正式接触Visual Basic。由于我在公司产品的Toolkit团队工作,我开发的所有Toolkit COM对象都使用ATL + STL实现。尽管如此,我已精通Visual Basic,并将其用于开发测试平台或实现我们基础接口的示例COM对象。
过去一年我参加的几个微软Web开发和电子商务研讨会中,许多演讲者都在宣扬业务逻辑最好在COM对象中实现,而不是在脚本中实现。当然,如果脚本程序员没有C++ / COM开发背景,VB是首选工具。
即使使用全局变量并非程序员的首选,我也见过很多依赖于它的代码。如果您在代码中不使用全局变量,那么可以安全地跳过本文的其余部分。我本人会尽一切努力避免使用全局变量,但有时它们是不可避免的。
对于C++ COM对象,全局变量由所有COM对象的实例共享,无论它们是在哪个单元中创建的,还是由哪个线程访问的。如果C++ COM对象是Apartment、Both或Free线程的,则所有全局变量都需要用临界区保护。
Visual Basic允许创建单线程或单元线程的COM对象。在前者的情况下,该对象的所有实例都将在主STA中创建。在这种情况下,使用全局变量没有问题,因为所有对象都只能由与该单元关联的单个线程访问。在后者的情况下,Visual Basic使用线程本地存储(TLS)来存储全局变量的实例,而不是用临界区包装它们。因此,结果是每个线程都有一个全局变量的实例。
如果您期望如此,那很好。如果您像我一样,来自C++ / COM背景,那么这会令人惊讶。它也可能导致应用程序逻辑出现问题。如果您认为永远不会遇到这些线程问题,请再考虑一下。如果您正在开发Web应用程序,ASP默认情况下使用每个处理器10个线程的线程池。