只有注册用户登录后才能阅读该文。 阅读全文
posted @ 2013-01-10 20:48 怡馨 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 摘要:访 问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许 可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。Semaphore的理解通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该 信号量许可证的线程 阅读全文
posted @ 2013-01-10 11:51 怡馨 阅读(782) 评论(0) 推荐(0) 编辑
摘要: 摘要:ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步初次体验ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析:在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。可以通过构造函数的 参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。如果某个线程调用WaitOne方法,则 阅读全文
posted @ 2013-01-10 11:49 怡馨 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 在移动交通流调查项目的一个算法分析程序中,碰到一个业务问题:用户采集上传的基站定位数据需要进行分析预处理,方案是先按预定格式解析文件并从中 提取出成百上千个基站定位数据记录,并合并相同的基站点,根据获取到的基站位置信息作为参数,去请求google 基站定位 api,从而得到对应的基站定位经纬度等信息,接下来再加上华工的算法分析。 在执行华工算法分析逻辑之前,调用谷歌api这一步必需全部完成;网络请求是个耗时的过程,故对每一个请求开启单独的线程(同时请求可能数百个,这里通过Semaphore信号量来控制每次发出请求的最大数,该部分的讨论不再本话题之类)。 问题出来了,那么如何知道所有的网络请求全 阅读全文
posted @ 2013-01-10 11:45 怡馨 阅读(500) 评论(0) 推荐(0) 编辑
摘要: 摘要:Thread.Sleep(0) MSDN上的解释是挂起此线程能使其他等待线程执行。这样的解释容易导致误解,我们可以这样理解,其实是让当前线程挂起,使得其他线程可以和当前线程再次的抢占Cpu资源。线程这一概念,可以理解成进程中的一个小单元。这个单元是一个独立的执行单元,但是与进程中的其他线程共享进程中的内存单元。由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线程交替执行。Thread.Sleep() 本身的含义是当前线程挂起一定时间。Thread.Sleep(0) MSDN上的解释是挂起此线程能使其他等待线程执行。这样的解释容易导致误解,我们可以这样理解,其 阅读全文
posted @ 2013-01-10 11:44 怡馨 阅读(307) 评论(0) 推荐(0) 编辑
摘要: ManualResetEvent 用于线程同步,通知一个或多个线程某事件已经发生。通常用于一个线程执行的任务必须在其他线程的任务执行之前完成。ManualResetEvent状态分为两种:终止状态和非终止状态。当某一任务完成时,将ManualResetEvent设置为终止状态,这样其他等待的线程(一个或多个)将开始执行自己的任务。注意:一旦它被终止,它将保持终止状态,直到它被手动重置。代码示例:代码class Program { staticvoid Main(string[] args) { Caclultae calc =new Ca... 阅读全文
posted @ 2013-01-10 11:42 怡馨 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 1.线程池,顾名思义,就是装着若干个线程的池子。2.出现理由 可以更为有效的使用线程。 如何理解这个“有效”? (1)我们知道线程在使用之前一般是处于休眠状态的,这样浪费了大量资源创建它,但是却没有使用它,真的是浪费资源。(2)使用线程时,线程之间的切换也会浪费大量资源。而线程池,就是为了避免上述两个问题,从而更为有效的利用资源来完成线程之间的调度进而完成工作。3.线程池工作原理 如上图所示,线程池中维护着若干空闲进程,空闲线程的个数默认为每个处理器25个,最小值是系统的处理器的个数。 当有任务时,不需要程序员另外启动线程,而是通过ThreadPool.QueueUserWorkItem(). 阅读全文
posted @ 2013-01-10 11:42 怡馨 阅读(197) 评论(0) 推荐(0) 编辑
摘要: AutoResetEvent也是一个同步对象,它用于对资源的独占访问。当AutoResetEvent处于终止状态时,如果存在等待的线程,则在该线程执行后,AutoResetEvent变量将自动变为非终止状态。代码示例:代码class Program { staticvoid Main(string[] args) { Caclultae calc =new Caclultae(); Console.WriteLine("Result={0}",calc.result(234).ToString()); ... 阅读全文
posted @ 2013-01-10 11:41 怡馨 阅读(244) 评论(1) 推荐(0) 编辑
摘要: 摘要:WaitHandle类的用处可以调用它的方法,来等待若干个信号发生,即可以调节多个线程之间的同步在讨论WaitHandle类之前 我们先看一张MSDN上给的继承关系图: 红色框指出的部分,就是这篇文章要讨论的WaitHandle类,绿色框指出的部分就是本文提到的一些异步对象。可以看到,异步对象的父类就是WaitHandle异步对象如AutoResetEvent和ManualResetEvent定义了一种信号机制,这种机制用来表明是访问共享资源还是释放共享资源。1. WaitHanle类MSDN上的定义 封装了一些对象,这些对象等待着独占访问共享资源(Encapsulates operat 阅读全文
posted @ 2013-01-10 11:40 怡馨 阅读(575) 评论(0) 推荐(0) 编辑
摘要: Thread.Join()方法,顾名思义,在一个线程中加入一些东西。MSDN上解释其作用为:阻塞 “调用线程” 直到某个线程结束。这个翻译过来的解释有点晦涩。举个例子如下:static void Main(){ Thread t=new Thread(new ThreadStart(ThreadMethod)); t.Start();t.Join(); Console.WriteLine("I am Main Thread"); Console.Read();}void ThreadMethod(){ ...}从上面的代码中,我们可以看到存在两个线程:主线程和线程t回到Jo 阅读全文
posted @ 2013-01-10 11:39 怡馨 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 这里介绍C# lock关键字它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。C#语言有很多值得学习的地方,这里我们主要介绍C# lock关键字,包括介绍Monitor 类锁定一个对象等方面。C#提供了一个lock关键字,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,C# lock关键字定义如下:lock(expression) statement_blockexpression代表你希望跟踪的对象,通常是对象引用。 ... 阅读全文
posted @ 2013-01-10 11:37 怡馨 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍C#多线程中的互斥对象Mutex和用它实现线程同步的方法。如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类。我们可以把Mutex看作一个出租车,乘客看作线程。乘客首先等车,然后上车,最后下车。当一个乘客在车上时,其他乘客就只有等他下车以后才可以上 车。而线程与Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待Mutex对象被释放,如果它等待的Mutex对象被释放 了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期 阅读全文
posted @ 2013-01-10 11:36 怡馨 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍C#中定时器(Timer)的使用和相关知识。Timer类:设置一个定时器,定时执行用户指定的函数。定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。初始化一个Timer对象:Timer timer = new Timer(timerDelegate, s,1000, 1000);// 第一个参数:指定了TimerCallback 委托,表示要执行的方法;// 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;// 第三个参数:延迟时间——计时开始的时刻距现在的时间,单位是毫秒,指定为“0”表示立即启动计时器;// 第四个参数:定时器的时间间隔——计时开始以 阅读全文
posted @ 2013-01-10 11:35 怡馨 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍C#中的多线程的自动管理和线程池的相关知识。在多线程的程序中,经常会出现两种情况:一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应这一般使用ThreadPool(线程池)来解决;另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒这一般使用Timer(定时器)来解决;ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows才有的API函数。将线程安放在线程池里,需使用ThreadPool.QueueUserWorkI 阅读全文
posted @ 2013-01-10 11:32 怡馨 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍线程中的生产者和消费者的相关知识。前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,关键字lock定义如下:lock(expression) statement_blockexpression代表你希望跟踪的对象,通常是对象引用。如果你想保护一个类的实例,一般地,你可 阅读全文
posted @ 2013-01-10 11:31 怡馨 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍用C#如何实现和操纵一个线程相关知识。下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事)在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:using System;using System 阅读全文
posted @ 2013-01-10 11:30 怡馨 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 摘要:本文介绍多线程的相关概念和知识。什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就 阅读全文
posted @ 2013-01-10 11:29 怡馨 阅读(163) 评论(0) 推荐(0) 编辑
摘要: http://msdn.microsoft.com/zh-cn/library/7a2f3ay4(VS.80).aspx此示例演示如何创建辅助线程,并用它与主线程并行执行处理。还将演示如何使一个线程等待另一个线程,并正确地终止线程。有关多线程处理的背景信息,请参见托管线程处理和使用线程处理(C# 编程指南)。该示例创建一个名为 Worker 的类,该类包含辅助线程将执行的方法 DoWork。这实际上是辅助线程的 Main 函数。辅助线程将通过调用此方法来开始执行,并在此方法返回时自动终止。DoWork 方法如下所示: public void DoWork(){ while (!_shouldS 阅读全文
posted @ 2013-01-10 11:27 怡馨 阅读(347) 评论(0) 推荐(0) 编辑
摘要: Join,单词本事就是连接的意思。先贴出几段代码猜猜结果。<1> public static int Main() { Alpha oAlpha = new Alpha(); Thread Thread1 = new Thread(delegate() { Console.WriteLine("A"); }); Thread1.Start(); Console.WriteLine("a"); return 0; }结果是先打印 A 还先打印 a ? <2> public static int Main() { Alpha oAlp 阅读全文
posted @ 2013-01-10 11:23 怡馨 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动View Code1 namespace 多线程 2 { 3 public class Simple 4 { 5 6 public static int Main() 7 { 8 Console.WriteLine("Thread Start/stop/join sample"); 9 Alpha alpha =... 阅读全文
posted @ 2013-01-10 11:19 怡馨 阅读(1001) 评论(0) 推荐(0) 编辑