`
kavy
  • 浏览: 866764 次
  • 性别: 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已经帮我们准备好了很多东西,欢迎大家拍砖。


分享到:
评论

相关推荐

    SpringBoot实现动态切换数据源(含源码)

    在数据源切换的场景中,我们通常将数据源信息存储在 `ThreadLocal` 中,然后在数据访问层(如 DAO)中通过 `ThreadLocal` 来获取当前线程的数据源信息,从而动态地切换数据源。 `AbstractRoutingDataSource` 是 ...

    Delphi多线程编程之三 同步读写全局数据

    这个函数可以使当前线程在dwMilliseconds指定的时间内睡眠,直到hHandle参数指定的对象进入发信号状态为止。一个互斥对象不再被线程拥有时,它就进入发信号状态。当一个进程要终止时,它就进入发信号状态。...

    程序、进程、线程的区别

    线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线...

    linux系统编程之线程.zip

    在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定。start_routine函数接收一个参数,是...

    深入理解Java并发之synchronized实现原理.docx

    也就是说当一个共享数据被当前正在访问的线程加上互斥锁后,在同一个时刻,其他线程只能处于等待的状态,直到当前线程处理完毕释放该锁。在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以...

    用多线程同步方法解决读者写者问

    用多线程同步方法解决读者写者问题(Reader-Writer Problem) ,设有20个连续的存储单元,写入/读出的数据项设定为1~20这20个字符。 要求; (1) 每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前...

    详细描述了Delphi多线程编程,超级简单易懂

    为了在多线程环境中安全地共享数据,Delphi提供了同步机制,如TCriticalSection、TMutex和TSemaphore。这些同步对象帮助开发者避免竞态条件和数据冲突,确保线程间的协调访问。 此外,Delphi还支持动态线程变量,...

    Java高级程序设计-多线程(二).pptx

    } } } // 当多个线程同时修改同一个共享数据时,将涉及数据安全问题 Java高级程序设计-多线程(二)全文共34页,当前为第7页。 3.1.1 模拟银行取款 由于多线程并发问题,一个线程执行余额操作可能未完毕,另外一个...

    浅析c# 线程同步

    线程共享资源并异步执行。 访问共享资源(数据)是有时可能会暂停系统的关键任务。所以可以通过线程同步来处理它。 主要场景如:存款,取款等交易业务处理。 线程同步的优点 一致性维护 无线程干扰 C#锁定 使用 C# ...

    多线程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

    关于Linux线程的线程栈以及TLS

    原则山私有并不是真的私有,因为大家都知道线程的特点就是共享地址空间,原则私有空间就是一般而言通过正常手段其它线程不会触及这些空间的数据。虽然Linux将线程和进程不加区分的统一到了task_struct,但是对待其...

    用多线程同步方法解决生产者-消费者问题

    (1) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符。 (2) 生产者和消费者各有两个以上。 (3) 多个生产者或多个消费者之间须共享对缓冲区...

    Java基础知识大全《自学宝典》

    共享数据:多个线程共同操作的同一个数据(变量) * 2.同步监视器:由一个类(任意类)的对象来充当.哪个线程获取此监视器,谁就执行大括号里被同步的代码,俗称:锁 * 要求:所有的线层必须共用同一把锁! * 注:在实现的...

    java面试宝典

    126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 128、在JSP中如何使用注释? 32 129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32...

    千方百计笔试题大全

    126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 128、在JSP中如何使用注释? 32 129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? ...

    亲测可用基于Linux消息队列的简易聊天室(C语言).zip

    亲测可用的基于Linux消息队列的简易聊天室(C语言)(附源代码)采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信...

    java/android 开发面试题

    能处理哪些类型的数据? 12. 请解释下Android程序运行时权限与文件系统权限的区别。(Edited by Sodino) 13. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。 14. 有一个一维整型数组int[]data...

    Spider:通过多线程选择数据,并保存到excel

    通过HttpClient获取到请求页面的字符串字符串 通过jsoup解析 (解析需要自己在页面上查看源代码,分析DOM结构) ...遍历当前这个列表集合,顺序为每个元素设置id属性 调用poi,遍历列表,将每个元素按行写入excel文件

    C语言实现生产者消费者问题

    定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程访问缓冲区之前先获取此信号量,在对缓冲区的操作完成后再释放此互斥信号量...

Global site tag (gtag.js) - Google Analytics