`
kavy
  • 浏览: 890566 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何设置当前线程的共享数据?

 
阅读更多
http://www.cnblogs.com/zhujiechang/archive/2008/11/03/1325828.html


  具体一点说就是在当前线程中设置指定数据并在当前线程内共享该数据,最主要的问题是该数据仅仅共享于当前的线程,线程间只会取得属于该线程的共享数据,举 个例子来说明这样的应用,最典型的示例就是HttpContext.Current这个应用,这个对象是在Web中经常用到的一个对象,通过一个静态方法 获得属于当前的HttpContext对象,Web的每一个Request请求都是单独的处于不同线程中,那么他们之间的Request等对象都是仅限于 当前线程中使用,通过这种方法使得各个Request之间互相独立,互相不受到影响,编写程序也非常的方便,这样的应用在Win32平台也是非常之多,下面来讲讲那么它在.NET下是如何实现的。
     首先第一个用到的类是Thread这个类,第二个类是LocalDataStoreSlot,是一个数据槽类,通过Thread这个类的两个静态方法使得他们联系在一起,分别是SetData (LocalDataStoreSlot slot, 
   Object data)和GetData (LocalDataStoreSlot slot).

引用下MS的示例来详细说明一下:

Code
using System;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread[] newThreads = new Thread[4];
        for(int i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] = new Thread(
                new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
    }
}
class Slot
{
    static Random randomGenerator;   //这个随机数做示例用的,可以是静态也可以不是,主要是为了使数据不同而设置的
    static LocalDataStoreSlot localSlot; //这个地方要求static的静态对象,一个数据槽

    static Slot()
    {
        randomGenerator = new Random();       
        //在所有的线程上分配未命名的数据槽,这个地方还是比较重要的,获得新的数据槽的方式,
        //可以理解为一个新的实例化,不过产生时确保它是有效的(未使用过的)
        localSlot = Thread.AllocateDataSlot();
    }

    public static void SlotTest()
    {
        // Set different data in each thread's data slot.
        Thread.SetData(localSlot, randomGenerator.Next(1, 200)); //当前线程上分配一个数

        // Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());    //只会获得当前线程上的那个数,注意这里传入的是共有的数据槽

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        //为了看清楚,我调整了一下这里,这时线程之间的执行顺序是随机的
        Thread.Sleep(randomGenerator.Next(200, 1000));   

        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());
            //依然是只会获得自己线程上所共享的那个数据,相当于HttpContext.Current
    }
}
类似这样的应用被广泛应用的很多框架上,是一项很简单实用的方法。

虽然很简单,但是实际上很多人都直接使用HashTable来实现类似的应用,其实MS已经帮我们准备好了很多东西,欢迎大家拍砖。


分享到:
评论

相关推荐

    winform 多线程处理数据

    `Invoke`是同步的,会阻塞当前线程直到操作完成;`BeginInvoke`是异步的,立即返回,操作在UI线程的空闲时间执行。 5. **异步更新UI** 当后台任务完成或有进度需要更新到UI时,可以通过`ReportProgress`方法通知UI...

    易语言线程返回数据的方法源码

    结束线程() // 结束当前线程 ``` 在这个例子中,`.线程函数`是线程执行的入口,它执行计算任务并把结果存储到线程变量中。主线程通过`等待线程结束`和`获取线程变量`来接收线程返回的数据。 然而,线程间的通信...

    跨线程提交数据

    8. **异步编程**:异步编程模型,如回调、Promise/Future或C#的async/await,可以在不阻塞当前线程的情况下发起IO操作,从而提高系统响应速度。 在实践中,跨线程提交数据时需要结合具体场景选择合适的同步策略。...

    线程共享锁 TMonitor 示例

    在实际的应用中,`TMonitor` 通常用于确保多个线程对共享数据的安全访问,防止数据竞争和死锁。例如,在 `FileWriterThreadU.pas` 文件中,可能有一个线程正在写入文件,而其他线程需要等待写入完成才能进行读取或...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    数据单元应保持一个全局状态,表示当前是否可读或可写: ```python from threading import Thread, Lock class DataUnit: def __init__(self): self.info = StudentInfo() self.read_lock = Lock() self.write...

    安全的编写多线程的_Java_应用程序

    - 设置锁的超时时间,尝试获取锁失败后释放当前已持有的锁。 - 使用工具类如`Lock`和`Condition`等高级并发控制结构。 #### 四、多线程编程实践 **1. AWT 和 Swing 中的多线程** - **AWT 和 Swing**: 图形界面...

    Hystrix跨线程传递数据解决方案:HystrixRequestContext.docx

    - **设置与获取**:通过 `HystrixRequestContext.setContextOnCurrentThread(HystrixRequestContext state)` 和 `HystrixRequestContext.getContextForCurrentThread()` 方法,可以在当前线程中设置或获取 `...

    MFC多线程 工作者线程 用户界面线程

    在开发和调试多线程程序时,可以利用MFC提供的afxThreadState类来跟踪当前线程的状态,以及使用Visual Studio的调试工具监视各个线程的行为。此外,设置断点、查看线程调用堆栈以及分析线程同步状态也是常用的调试...

    C#内存释放-线程控制-线程启动-线程暂停

    线程间的共享数据可能导致竞态条件,这可能会导致意外的行为。为了安全地访问共享数据,可以使用锁(如`lock`关键字)或监视器(`Monitor`类),以确保同一时间只有一个线程能访问这部分代码。此外,`volatile`...

    C#多线程处理实例

    然而,当多个线程共享数据,并且其中一个或多个线程要修改数据时,可能会出现无法预知的结果。如果一个线程正在更新数据,另一个线程也试图更新,那么数据所反映的就第二次更新操作之后的结果。所以可通过一次只允许...

    java多线程分页查询

    多线程是指在一个程序中包含多个可以并发执行的线程,这些线程共享相同的内存空间。通过合理利用多线程技术,可以显著提升程序的运行效率和响应速度。在Java中,可以通过继承`Thread`类或者实现`Runnable`接口来创建...

    数据流和多线程笔记

    - **线程同步**:当多个线程访问共享资源时,需要考虑线程安全问题。Java提供了多种机制来确保线程同步,包括`synchronized`关键字、显式锁(`Lock`接口)等。 #### 六、总结 通过对Java中的数据流和多线程的学习...

    易语言正确退出线程

    4. **线程回调**:设置线程的回调函数,当接收到退出信号时,线程内部的回调函数会执行,进行必要的清理工作,然后返回,这样线程就安全地结束了。 5. **异常处理**:在编写线程代码时,应考虑异常处理,确保在出现...

    易语言多线程控制线程数量源码

    可以通过全局变量或配置文件来设置最大线程数,当创建新线程时检查当前线程数是否超过限制。如果超过,可以暂停或延迟创建,或者采用线程池技术,预先创建一定数量的线程供程序使用。 6. **线程结束与清理**: 当...

    C#多线程编程实例实战.pdf

    单个写入程序/多个阅读程序的线程同步问题是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)需要读取数据。在这个同步问题中,很容易得到下面二个要求:1) 当一个线程正在...

    java多线程Demo

    在多线程环境下,如果一个变量被多个线程共享且只进行读写操作,可以使用volatile保证数据的一致性。 9. sleep(), yield(), interrupt(): - sleep()方法使当前线程暂停指定的时间,然后继续执行。 - yield()方法...

    设置指定线程的优先级共1页.pdf.zip

    1. **线程的定义**:线程是进程中的一个单一顺序控制流,它拥有自己的栈空间,与进程内的其他线程共享代码、数据和其他资源。线程间的切换比进程间切换更快,因为它们不需要切换地址空间。 2. **线程优先级**:操作...

    linux多线程手册

    - `pthread_getschedparam`函数用于查询当前线程的优先级设置。 #### 四、线程属性 ##### 属性对象 - 属性对象包含了线程的一些关键属性,如分离状态、调度策略等。 ##### 初始化属性 - 使用`pthread_attr_init...

    java多线程面试题

    重要的是,start()方法内部会调用run()方法,但直接调用run()方法并不会启动新线程,它仅会在当前线程中顺序执行。 知识点5:Runnable和Callable的区别 Runnable和Callable都代表要在不同线程中执行的任务。...

Global site tag (gtag.js) - Google Analytics