多线程和并发管理 .NET多线程服务
线程相关静态变量
默认静态变量应用程序域所有线程可见。如果静态变量需要在线程间共享,同步访问也就必然了。
线程相关静态变量保证线程安全,同一时间只有一个线程可访问,且每个线程都有该静态变量的拷贝。
- public class MyClass
- {
- //.NET支持线程相关静态变量
- //该特性只可修饰类的静态成员变量,不能用于属性,方法
- [ThreadStatic]
- private static m_MyString;
- public static string MyString
- {
- set { m_MyString = value; }
- get { return m_MyString; }
- }
- }
public class MyClass
{
//.NET支持线程相关静态变量
//该特性只可修饰类的静态成员变量,不能用于属性,方法
[ThreadStatic]
private static m_MyString;
public static string MyString
{
set { m_MyString = value; }
get { return m_MyString; }
}
}
线程本地存储(TLS)
全局托管堆上分配的对象对于所有应用程序域的所有线程都可见可访问(因此需要同步访问机制)。
.NET提供了线程专用堆TLS,无需同步那些分配到TLS上的对象访问,因为只有一个线程可以访问他们。
TLS提供了槽(LocalDataStoreSlot对象),用来存储对象。分为:命名槽(一定要显示释放),未命名槽(垃圾回收器自动释放)。
命名槽:
- Thread.CurrentThread.Name = "66";
- int number = 8;
- //显示释放命名槽
- Thread.FreeNamedDataSlot("My_TLS_Slot");
- //在当前线程上分配一命名槽
- LocalDataStoreSlot dataSlot = Thread.AllocateNamedDataSlot("My_TLS_Slot");
- //在当前线程上将数据存入命名槽(只有当前线程中的成员才可以访问)
- Thread.SetData(dataSlot, 8);
- //新建另一线程
- Thread thread = new Thread(GetData_2);
- thread.Name = "lulu";
- thread.Start();
- GetData();
- private void GetData()
- {
- object obj;
- //获取当前线程命名槽
- LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
- //获取当前线程槽中存储的值
- obj = Thread.GetData(dataSlot);
- int number = (int)obj;
- //输出:66 , 8
- //说明槽中数据只由创建槽的线程访问(只有一个线程可访问)
- Response.Write(Thread.CurrentThread.Name + " , " + number);
- }
- private void GetData_2()
- {
- object obj;
- LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
- obj = Thread.GetData(dataSlot);
- //输出:lulu
- //说明访问不到槽中数据,因为当前方法由另一线程调用
- if (obj == null)
- {
- Response.Write(Thread.CurrentThread.Name);
- }
- }
Thread.CurrentThread.Name = "66"; int number = 8;
//显示释放命名槽
Thread.FreeNamedDataSlot("My_TLS_Slot");
//在当前线程上分配一命名槽
LocalDataStoreSlot dataSlot = Thread.AllocateNamedDataSlot("My_TLS_Slot");
//在当前线程上将数据存入命名槽(只有当前线程中的成员才可以访问)
Thread.SetData(dataSlot, 8); //新建另一线程
Thread thread = new Thread(GetData_2);
thread.Name = "lulu";
thread.Start(); GetData(); private void GetData()
{
object obj;
//获取当前线程命名槽
LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
//获取当前线程槽中存储的值
obj = Thread.GetData(dataSlot); int number = (int)obj; //输出:66 , 8
//说明槽中数据只由创建槽的线程访问(只有一个线程可访问)
Response.Write(Thread.CurrentThread.Name + " , " + number);
} private void GetData_2()
{
object obj;
LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("My_TLS_Slot");
obj = Thread.GetData(dataSlot); //输出:lulu
//说明访问不到槽中数据,因为当前方法由另一线程调用
if (obj == null)
{
Response.Write(Thread.CurrentThread.Name);
}
}
未命名槽:
- //共享该对象
- private LocalDataStoreSlot dataSlot;
- protected void Page_Load(object sender, EventArgs e)
- {
- Thread.CurrentThread.Name = "66";
- //在当前线程上分配一未命名槽(由垃圾回收器释放,无需显示释放)
- dataSlot = Thread.AllocateDataSlot();
- //在当前线程上将数据存入未命名槽(只有当前线程中的成员才可以访问)
- Thread.SetData(dataSlot, 8);
- //创建一新线程
- Thread thread = new Thread(GetData_2);
- thread.Name = "lulu";
- thread.Start();
- GetData();
- }
- private void GetData()
- {
- //获取当前线程未命名槽中值
- object obj = Thread.GetData(dataSlot);
- Response.Write(Thread.CurrentThread.Name + " , " + (int)obj);
- }
- private void GetData_2()
- {
- object obj = Thread.GetData(dataSlot);
- if (obj == null)
- {
- Response.Write(Thread.CurrentThread.Name);
- }
- }
//共享该对象
private LocalDataStoreSlot dataSlot; protected void Page_Load(object sender, EventArgs e)
{
Thread.CurrentThread.Name = "66"; //在当前线程上分配一未命名槽(由垃圾回收器释放,无需显示释放)
dataSlot = Thread.AllocateDataSlot();
//在当前线程上将数据存入未命名槽(只有当前线程中的成员才可以访问)
Thread.SetData(dataSlot, 8); //创建一新线程
Thread thread = new Thread(GetData_2);
thread.Name = "lulu";
thread.Start(); GetData();
} private void GetData()
{
//获取当前线程未命名槽中值
object obj = Thread.GetData(dataSlot);
Response.Write(Thread.CurrentThread.Name + " , " + (int)obj);
} private void GetData_2()
{
object obj = Thread.GetData(dataSlot);
if (obj == null)
{
Response.Write(Thread.CurrentThread.Name);
}
}
线程池
由.NET管理,包含一组线程随时准备为应用程序的请求服务(异步调用,远程调用,计时器调用都用到线程池)。可通过ThreadPool静态类访问。
线程池中实际有2种线程:工作线程,完成端口线程。
默认情况下,线程池工作线程最大数是每个CPU每个进程25个。
多线程和并发管理 .NET多线程服务的更多相关文章
- Java多线程与并发基础
CS-LogN思维导图:记录专业基础 面试题 开源地址:https://github.com/FISHers6/CS-LogN 多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么 ...
- Java 并发性和多线程
一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...
- python 并发编程之多线程
一.线程理论 1.什么是线程 多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源. 所以,进程只是用来把资 ...
- 30 python 并发编程之多线程
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python ...
- 百万年薪python之路 -- 并发编程之 多线程 二
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...
- Java 多线程与并发【原理第二部分笔记】
Java 多线程与并发[原理第二部分笔记] 什么是Java内存模型中的happens-before Java内存模型,即JMM,本身是一种抽象的概念,并不是真实存在的,他描述的是一组规则或者说是一种规 ...
- JAVA 多线程和并发学习笔记(三)
Java并发编程中使用Executors类创建和管理线程的用法 1.类 Executors Executors类可以看做一个“工具类”.援引JDK1.6 API中的介绍: 此包中所定义的 Execut ...
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
随机推荐
- Fedora 14 x64 试用手记
欢迎大家给我投票: http://2010blog.51cto.com/350944 刊登在: http://os.51cto.com/art/201011/235506.htm FC14桌面使用体验 ...
- mac机器下远程仓库添加完毕之后,却无法上传应有的内容。
Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you ha ...
- SharePoint咨询师之路:备份和恢复系列二 - 备份服务器场
本系列包括: 备份服务器场和配置 备份web和服务应用程序 备份内容数据库 备份网站集 备份自定义项 根据“SharePoint咨询师之路:备份和恢复系列--制定备份计划”我们制定了一下备份计划如下: ...
- 第一百九十四天 how can I坚持
该挺妈妈话的,不该买可乐,该熬点粥喝,肚子疼,救我. 好像每天都一样,每天都在重复.. 哎.. 对了,买了点花种子,铜钱草,牡丹.玫瑰.还买了棵小多肉. 还有,老妈把咸菜给邮过来了,有点期待啊. 连续 ...
- ubuntu设置服务开机启动
在Ubuntu下用sysv-rc-conf命令,它是chkconfig的替代命令,而使用方法与chkconfig基本相同. 安装: sudo apt-get install sysv-rc-conf ...
- 每天学一点-Jquery判断checkbox是否为选中状态
if ($("#ctl00_ContentPlaceHolder1_IsLimitedService").attr("checked") ==true)
- OSPF ProcessID(进程号)详解
一.OSPF ProcessID本地有效 首先明确一下,OSPF ProcessID,范围为1-65535,用于在路由器本地标识OSPF进程. 看上图,R1使用进程号10创建了一个OS ...
- Android 显示/隐藏 应用图标
PackageManager packageManager = getPackageManager(); ComponentName componentName = new ComponentName ...
- 3DSlicer源代码编译过程vs2008+windows xp [转]
一 下载QT源代码编译 1. 简述 在 Windows2000/xp/vista 下,安装 VS2008, QT 4.7.2 :并在 VS2008上建立 QT 的集成开发环境,利用 VS2008 ...
- 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...