- 浏览: 1088617 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (399)
- C++ (39)
- Java (74)
- Java界面开发学习笔记 (4)
- Java用户的c++之旅 (0)
- 自言自语 (12)
- DSP (1)
- MCU (0)
- CG (0)
- Jabber (0)
- Gloox (0)
- Linux (11)
- Windows (19)
- Networks (4)
- Jobs (0)
- PHP (1)
- JSP (2)
- 生活 (35)
- C (2)
- Qt4 (2)
- C# (50)
- WPF (5)
- ASP (2)
- FLEX (47)
- SQL (20)
- JavaScript (12)
- SharePoint (6)
- GWT (1)
- Dojo (9)
- HTML (11)
- Others (7)
- 如何安装配置系列 (7)
- UML (2)
- Android (3)
- alibaba (1)
最新评论
-
zxjlwt:
学习了http://surenpi.com
Firefox插件开发: Hello World! -
ylldzz:
楼主知道MVEL怎么调试么
MVEL简介及快速使用 -
blueman2012:
您好,可否提供源码下载,我把您的代码贴过来后,好多报错的,谢谢 ...
Log4J日志解析 -
svygh123:
你的游标都没有关闭呢!
MYSQL游标嵌套循环示例 -
dizh:
写的很好啊
MVEL简介及快速使用
与多线程相关的两个常见的需要解决的问题是:临界资源保护和线程间的同步依赖,每一种语言都提供了自己的一套设施(有的语言可能需要借助OS的API)来解决这两个问题,C#提供了更方便灵活的解决方案,首先C#可以允许我们在不同的级别上加锁,也就是说我们可以控制加锁的粒度。其次,C#提供了一套内置的线程安全的容器,方便我们的使用。
一.不同级别(Level)上的同步:
1.object level 同步
对应的class必须从ContextBoundObject继承(同步上下文context,使所有的方法调用能被截获),并且在class上运用SynchronizationAttribute 。
2.Method level 同步
System.Runtime.CompilerService空间包含的一些属性将影响CLR在运行期间的行为。特性MethodImplAttribute可以用于需要进行同步控制的方法上。
3.code segment level 同步
(1)Monitor类(主要是静态方法)
Monitor.Enter(obj)//获得加在对象obj上的锁 ... Monitor.Exit(obj)//释放锁 //上面两句之间的代码相当于lock(obj){...} Monitor.TryEnter(obj)//该方法立即返回,如果返回值为false,则接下来不需要Monitor.Exit(obj)。 //以下几个方法用于线程间的交互 ==》 解决同步依赖 Monitor.Wait(obj)//等待脉冲消息。释放对象上的锁并阻塞当前线程,以后只有其它线程调用Pulse或PulseAll时才会给它再次获得锁的机会 Monitor.Pulse(obj)//发射脉冲消息( 只有得到锁后才能发射,而且发射不会自动释放锁) Monitor.PulseAll(obj)
注意:
(1)Monitor 锁定对象,只能在Enter()和Exit()之间的代码块中调用Wait和Pulse
(2)不能在一个线程中获得锁,而在另一个线程中释放锁。这样会产生锁丢失。 获得锁和释放锁应该在同一个线程中完成。
(3)lock语句
lock(obj) { 需要进行同步的代码 }
(4)ReaderWriterLock类
实现单写多读程序的锁。
AcquireReaderLock()//当没有写程序线程占用锁时,就可获得锁 AcquireWriterLock()//当没有任何读写程序线程占用锁时,才可获得锁 ReleaseReaderLock() ReleaseWriterLock()
(5)ManualResetEvent
Set()方法将状态设置为有信号 Reset()将其设置为无信号 WaitOne()将阻塞到其有信号为止,若调用WaitOne的时刻就是有信号的,将不会阻塞
(6)AutoResetEvent
与ManualResetEvent的区别是,AutoResetEvent.WaitOne()会自动改变事件对象的状态,即AutoResetEvent.WaitOne()每执行一次,事件的状态就改变一次。有信号-->无信号;无信号-->有信号
说明:
(1)无论是Monitor还是lock、ReaderWriterLock都只对引用类型的对象有效,因为引用类型的对象有一个隐藏的sync#字段,该字段的作用就是作为加锁的标记。
(2)上述的各种设施中,只有Monitor 和ManualResetEvent/AutoResetEvent 能解决线程间的同步依赖问题,而其它的设施主要用于解决临界资源共享。
4.member level同步
(1)Interlocked类(主要是静态方法)
同步一个由许多线程共享的变量。
Decrement(ref int);//使变量减1 Increment(ref int);//使变量加1 //以上两个方法仅针对类int变量 Exchange(ref object, object);
(2)ThreadStaticAttribute
该特性用于修饰静态变量,被该特性修饰的静态变量在每个线程中都有自己的副本。
二.创建线程安全的对象
Hashtable h = Hashtable.Synchronized(new Hashtable()) ;
ArrayList等容器也提供类似操作。
转自:http://tech.it168.com/n/2007-04-27/200704271521359.shtml
发表评论
-
策略模式
2010-10-08 16:34 1201一、概念 策略模式(Strategy):它定义了一系 ... -
C#获取返回错误码
2010-05-21 17:59 1847[DllImport("TestWin32Dl ... -
VS.NET 开发Windows服务的步骤
2010-05-20 14:25 1624在很多应用中需要做windows服务来在一些后台操作,比如监视 ... -
c# 允许服务与桌面交互
2010-05-20 14:20 2740我们写一个服务,有时候要让服务启动某个应用程序,就要修 ... -
C#单例模式的三种写法
2010-05-19 15:58 48589第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, ... -
C#中获取我的文档系统文件夹路径
2010-05-17 15:29 2289本技巧使用GetFolderPath方法来获取指向由指定枚 ... -
C#自定义事件的步骤介绍
2010-05-13 17:54 3321通常C#自定义事件有下面的几个步骤: ... -
使用反射机制遍历对象中的属性名及属性值
2010-05-03 16:20 2875首先描述一种情景,当给你一个VO类(这个类是映射到数据库的表 ... -
C#的逆向工程-IL指令集
2010-04-30 10:28 1725一些 IL 语言解释: ... -
使用SqlHelper时“阅读器关闭时read的尝试无效”的解决方法
2010-04-20 14:54 1855原SqlHelper类中ExecuteReader方法体 ... -
C# 删除文件夹
2009-12-31 11:28 2601/// <summary> ... -
System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
2009-12-16 23:44 5239.NET Framework里面提供了三种Timer: ... -
关于var1=var2=something赋值语句的思考
2009-11-18 16:16 1279刚才在阅读《c#本质论》一书时,开头有提到var1=var2= ... -
C#使textbox滚动到最新一行
2009-11-16 12:33 2595方法1: textBox.Text += " ... -
Invoke()/BeginInvoke()区别
2009-11-15 17:43 7271查看MSDN如下: Control..::.Inv ... -
Invoke 和 BeginInvoke 的真正涵义
2009-11-15 17:37 1361BeginInvoke 方法真的是新开一个线程进行异步调用 ... -
线程,同步与锁——Lock你到底锁住了谁
2009-11-15 01:18 1613线程在多核时代的优势月来越明显,多线程编程的学习也提上议事日程 ... -
关于lock(this)的说明及用法
2009-11-15 01:16 5402一. 为什么要lock,lock了 ... -
远程dll注入 C#
2009-11-14 16:43 3164using System; using System. ... -
C# 3.0新特性之扩展方法
2009-11-09 17:02 1015C#3.0扩展方法是给现有类型添加一个方法。现在类型既可是基本 ...
相关推荐
### 在C#中编写多线程应用程序 #### 引言 多线程是现代软件开发中的一个重要概念,尤其是在像C#这样的高级编程语言中。它允许程序同时执行多个任务,从而提高了应用程序的性能和响应性。本文将详细介绍如何在C#中...
本项目,"C#编写的多线程多主机端口扫描程序",正是针对这一需求而设计的。它利用C#编程语言的强大功能,特别是其对多线程的支持,实现了高效快速地扫描多个主机的多个端口。 首先,我们来理解多线程的概念。在单...
在本案例中,"c#编写的多线程上位机"是一个利用C#实现的,具有多线程功能的上位机程序。上位机通常指的是用于控制和通信的计算机,它与下位机(如PLC、单片机等)进行数据交互,以实现自动化设备或系统的监控和管理...
描述:由C#编写的多线程异步抓取网页的网络爬虫控制台程序 功能:目前只能提取网络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常...
以下是对"C#编写多线程程序源码"的详细解读: 1. **线程概念**:线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,`System.Threading`命名空间提供了创建和管理线程的类和方法。 2. **...
这个基于C#开发的多线程处理程序源代码,是利用Visual Studio 2005 (VS2005) 开发环境构建的,旨在演示如何有效地利用多线程进行后台运算和同步处理。 首先,我们要理解什么是多线程。在单核CPU系统中,多线程可以...
总之,这个"C#编写的多线程计算器"项目展示了如何利用C#的多线程特性来优化计算密集型任务的执行,提高程序的响应速度。通过合理设计和使用同步机制,可以实现高效且线程安全的计算环境。这个实例对于学习多线程编程...
在C#中编写多线程应用程序,简单!_www_knowsky_com.htm在C#中编写多线程应用程序,简单!_www_knowsky_com.htm在C#中编写多线程应用程序,简单!_www_knowsky_com.htm
在C#编程语言中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。多线程是现代计算环境中不可或缺的一部分,尤其是在处理大量数据、进行复杂计算或者需要实现并发操作的...
本文将深入探讨标题为"C# 编写的多线程的源码"的项目,以及相关的知识点。 首先,多线程允许一个应用程序同时执行多个任务,提高程序的并发性。在C#中,可以使用System.Threading命名空间中的Thread类来创建和管理...
在C#编程中,多线程是一个核心概念,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。创建多线程可以利用多核处理器的优势,将复杂的任务分解为若干个独立运行的部分,使得程序能更好地处理大量数据或...
以上知识点涵盖了C#中多线程串口通讯的基本原理和实践技巧,通过学习和掌握这些内容,开发者可以编写出高效、稳定的串口通信程序。在实际项目中,还需要根据具体需求和硬件环境调整和完善代码。
在C#编程中,多线程是一项核心技能,特别是在处理并发任务、提高应用程序性能和响应速度时。这个名为"C#多线程测试程序"的示例项目,旨在帮助开发者更深入地理解C#中如何创建和管理多线程。下面我们将详细探讨C#多...
本项目“C#编写多线程搜索引擎”(WebApplication1)正是利用了这一特性,旨在创建一个能够并行处理搜索请求的搜索引擎。 首先,我们要理解什么是多线程。在单线程系统中,程序执行是顺序的,一次只能执行一个任务...
C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先...
在C#编程中,多线程消息处理是一个关键的领域,尤其在开发高效、响应迅速的应用程序时。本文将深入探讨“C#多线程消息处理例子”中的核心概念,包括消息处理、线程间通信、UI交互以及代理的使用。 首先,我们需要...
本项目“基于Socket的多线程C#爬虫程序”采用C#语言编写,利用Socket通信库进行网络连接,结合多线程技术提高爬取效率,为用户提供了高效、灵活的数据抓取解决方案。 首先,我们来理解Socket在网络编程中的作用。...
6. **Program.cs**: 通常这是C#程序的主入口点,定义了`Main`方法,它启动程序并调用其他类和方法来初始化和运行整个应用程序。 7. **WinLoadDown.csproj**: 这是一个项目文件,用于描述C#项目的所有元数据,包括...
在C#编程语言中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本源码示例是基于C#和Visual Studio 2005(VS2005)开发的,旨在帮助开发者理解和实践多线程处理的复杂...