.NET多线程小记(5):线程独享数据TLS

简介:

线程本地存储(Thread Local Storage TLS

在.NET程序中,静态变量是全局(整个应用程序域)可见的数据,一个普通的静态变量对于应用程序域内的所有线程都是可见并且是可访问的。

TLS是指存储在线程环境块内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外却是不可见的。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading;
 
namespace  MultiThreadTest
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             for  ( int  i = 0; i < 5; i++)
             {
                 Thread thread = new  Thread(TestTLS.Task);
                 thread.Start();
             }
             Console.Read();
         }       
     }
 
     class  TestTLS
     {       
         static  LocalDataStoreSlot localSlot = Thread.AllocateDataSlot();
 
         public  static  void  Task()
         {
             Thread.SetData(localSlot, Thread.CurrentThread.ManagedThreadId);
 
             Console.WriteLine( "Thread {0}, Data: {1}" ,Thread.CurrentThread.ManagedThreadId.ToString(),
                 Thread.GetData(localSlot));
 
             Thread.Sleep(1000);
 
             Console.WriteLine( "Thread {0}, Data: {1}" , Thread.CurrentThread.ManagedThreadId.ToString(),
                 Thread.GetData(localSlot));       
         }
     }
}

输出:

clip_image002

还可以使用ThreadStaticAttribute特性实现类似功能。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading;
 
namespace  MultiThreadTest
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             for  ( int  i = 0; i < 5; i++)
             {
                 Thread thread = new  Thread(ThreadStatic.Task);
                 thread.Start();
             }
             Console.Read();
         }       
     }
 
     class  ThreadStatic
     {
 
         [ThreadStatic]
         static  int  mThreadId = 0;
         static  int  mGId = 0;
 
         public  static  void  Task()
         {
             mThreadId = Thread.CurrentThread.ManagedThreadId;
             mGId = Thread.CurrentThread.ManagedThreadId;
 
             Console.WriteLine( "[Thread : {0}], mThreadId: {1}, mGid: {2}" ,
                 Thread.CurrentThread.ManagedThreadId.ToString(),
                 mThreadId, mGId);
 
             Thread.Sleep(1000);
 
             Console.WriteLine( "[Thread : {0}], mThreadId: {1}, mGid: {2}" ,
                 Thread.CurrentThread.ManagedThreadId.ToString(),
                 mThreadId, mGId);
         }       
     }
}

输出:

clip_image002[4]

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2009/11/06/1597450.html如需转载请自行联系原作者


王德水

相关文章
|
3月前
|
Java 索引
多线程向设备发送数据
多线程向设备发送数据
69 0
|
3月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
161 0
|
3月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
4月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
300 5
|
8月前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
293 20
|
6月前
|
网络协议 定位技术 网络安全
IPIP.NET-IP地理位置数据
IPIP.NET 是一家专注于 IP 地理位置数据的提供商,基于 BGP/ASN 数据与全球 800+ 网络监测点技术,提供高精度的 IPv4 和 IPv6 定位服务。其核心服务包括地理位置查询、详细地理信息和网络工具等,广泛应用于网络安全、广告营销、CDN 优化等领域。数据覆盖全球,支持多语言,每日更新确保实时性。IPIP.NET 提供 API 接口、离线数据库及多种语言 SDK,方便开发者集成使用。
1051 0
|
8月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
7月前
|
数据采集 存储 安全
Python爬虫实战:利用短效代理IP爬取京东母婴纸尿裤数据,多线程池并行处理方案详解
本文分享了一套结合青果网络短效代理IP和多线程池技术的电商数据爬取方案,针对京东母婴纸尿裤类目商品信息进行高效采集。通过动态代理IP规避访问限制,利用多线程提升抓取效率,同时确保数据采集的安全性和合法性。方案详细介绍了爬虫开发步骤、网页结构分析及代码实现,适用于大规模电商数据采集场景。
|
8月前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。

热门文章

最新文章