单线程应用程序是否安全

时间:2013-04-11 09:20:28

标签: vb.net

我理解多线程公寓的概念,即如果一个对象是由一个线程创建的,那么它可以在所有其他线程中使用。

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

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

2 个答案:

答案 0 :(得分:0)

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

在ASP.NET中,这与您所说的不同。除了特定的页面之外,IIS并不关心您创建的对象。您的主要线程是针对给定的请求,并且主要对象是“页面”,页面中存储的任何内容都存在于此类避风空间中,其中没有任何冲突可以真正发生。也是会话对象,这是页面特定的,并且尽可能地与特定请求相关,因此是安全的。从来没有一个Page或Session对象暴露给另一个,但这些页面都在同一个应用程序中,并且在技术上可以相互看到(除非你做了一些极其奇怪的编码,肯定会非常非常糟糕)。

更大程度上不安全的是Application对象。如果将对象存储在应用程序空间中并在多个页面请求中使用它,则需要确保对该对象所做的任何操作都不会与可以在并行请求中处理的另一个请求发生冲突。例如,可以在应用程序空间中存储静态DataTable项。我通常不会这样做但是如果你必须以一种安全的方式处理它是使用同步对象不允许来自一个请求/线程的代码重叠此对象。 另请注意,Application对象/空间实际上与VB.Net中的Public Module Space相同,我使用模块来显示下面的示例......

示例 (这非常简化,而不是我通常在代码中做的事情,只是解释SYNCLOCK机制)

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”的块内访问,它就可以跨多个线程安全。但是,以这种方式访问​​没有SyncLock的“dt”是不可接受的,因为可能会发生重叠。

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

答案 1 :(得分:0)

不能保证单线程进程的线程安全。 如果某个进程收到信号,并且访问某些关键数据时该进程停止,并且单个处理程序也访问该关键数据,那么它不是线程安全的。