2013-04-11 150 views
1

我理解多线程单元的概念,即如果一个对象是由一个线程创建的,那么它可以用于所有其他线程。单线程应用程序是否线程安全

我读过,每个进程有一个多线程的公寓。在ASP.NET中,通常有一个用于IIS的W3WP.exe进程。因此,IIS如何区分由一个用户在一个会话或一个应用程序中创建的对象与另一个用户由另一个会话创建的对象?我假设会话对象和应用程序对象被使用,但我不清楚,并想知道是否有其他机制。

工作线程和I/O线程如何适应这个概念?即如果我有一个程序不会自己创建任何线程(使用System.Threading.Thread),并且不使用.NET框架的那些部分以外的任何第三方库,那么我假定所有的代码都在该程序是线程安全的?

回答

0

当您处理标准的FORMS或CMD Line应用程序时,假设您没有创建任何显式线程并且不使用任何暗示像后台工作程序这样的单独线程的组件,那么您正在主应用程序线程上运行通常输入用户代码。系统将创建其他线程来做各种事情来支持你的应用程序,但对于所有密集的目的,你可以认为它是线程安全的。还有其他线程将成为otehr组件的一部分,并且应该已经以安全的方式进行编码,以便不会发生任何冲突或交叉线程问题。

在ASP.NET中,这与您所说的不同。除了特定的页面之外,IIS并不关心你创建的对象。你的主线程是针对一个给定的请求的,而主要的对象实际上是“页面”,页面中存储的任何内容都位于这种没有冲突真正需要的地方。此外,会话对象,这是特定于页面,并尽可能安全地隔离到特定请求。从来没有一个页面或会话对象暴露给另一个,但这些页面都在同一个应用程序中,并且在技术上可以彼此看到(除非你做了一些非常奇怪的编码,而这个编码肯定会非常非常糟糕)。

什么变得不安全的程度更大是应用程序对象。如果将对象存储在应用程序空间中并在多个页面请求中使用它,则需要确保对该对象做的任何操作都不会与另一个可能在平行请求中处理的请求发生冲突。这样的例子可能是在应用程序空间中存储项目的静态数据表。我通常不会这样做,但是如果您必须以安全的方式来处理它,则是使用syncronization对象来禁止来自一个请求/线程的代码重叠此对象。 还要注意的是Application对象/空间实际上是相同的公共空间模块在VB.Net,我用一个模块来显示下面的例子...

(这是非常简单的上,而不是我的东西通常会在代码中做到这一点是因为长的解释只有SYNCLOCK mechanizm)

Public Module SharedSpace 

    ' what object is used as a syncronizer is irrelavent, just needs defined only once at the start of the application. 
    Public SyncDT As New Exception("none") 

    Public dt As DataTable 

End Module 

Public Class PageItem 
    Inherits System.Web.UI.Page 

    Private Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 

     SyncLock SyncDT 
' ... 
' work with "dt" ONLY inside the synclock space 
' SyncLock blocks can be anywhere but they need to be as short as possible. 
' Any code running in another page request will STOP trying to enter the SyncLock (for the object specified) 
' and waits until any existing SyncLock on the same object is released by exiting the SyncLock. 
' ... 
     End SyncLock 

    End Sub 

End Class 

有效地为“DT”与“SYNCLOCK SyncDT”这是在多个线程安全块内部的访问。但是,由于可能发生重叠,因此无法以这种方式访问​​“dt”而不使用SyncLock。

.NET中还有其他线程编组对象,Synclock是我的首选。