C#多线程编程
摘要:一、基本概念进程:当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。静态属性:这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。二、多线程的优劣优点:可以提高CPU的利用率。在多线程程序中
阅读全文
C#多线程JOIN方法初探
摘要:[说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白。后来经过自己的一番试验,终于弄清了Join()的本质。大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝贵意见。] Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。 试一试:线程的插入 //《C#初学课堂》 //注意添加命名空间 using System.Threading; static void Main(string[] a...
阅读全文
秒杀多线程第八篇 经典线程同步 信号量Semaphore
摘要:阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》《秒杀多线程第七篇经典线程同步互斥量Mutex》前面介绍了关键段CS、事件Event、互斥量Mutex在经典线程同步问题中的使用。本篇介绍用信号量Semaphore来解决这个问题。首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。第一个CreateSemaphore函数功能:创建信号量函数原型:HANDLECreateSemaphore(LPSECURITY_ATTRI
阅读全文
AutoResetEvent和ManualResetEvent
摘要:首先说说线程的终止状态和非终止状态。AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态。true表示终止状态,false表示非终止状态。看代码片段1:代码片段1: AutoResetEvent _autoResetEvent = new AutoResetEvent(false); private void BT_Temp_Click(object sender, RoutedEventArgs e) { Thread t1 = new Thread(this.Thread1Foo); t1.Start(); Thre.
阅读全文
谈谈多线程的思维方式
摘要:前段时间仔细看过些关于多线程方面的资料,项目中用到线程的地方也不少,可是,当看了Jeffrey的一篇关于锁的文章后,发现自己虽然一直都在使用多线程,但是缺少了做多线程编程需要的思维!所以想从Jeffrey的Optex(锁)入手,来谈谈我从其中体会的东西。在NET中,我们用的最多的锁机制就是lock,用起来很简单,短短几行程序就可以实现,例如:publicclassTestThreading{privateSystem.ObjectlockThis=newSystem.Object();publicvoidFunction(){lock(lockThis){//Accessthread-sens
阅读全文
C#多线程之二:ManualResetEvent和AutoResetEvent
摘要:初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。如果某个线程调用WaitOne方法,则当信号处于发送状态时,该线程会得到信号, 继续向下执行。其区别就在调用后,AutoResetEv
阅读全文
C# 多线程之一:信号量Semaphore
摘要:Semaphore的理解通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。常见的操作方法 WaitOne():申请一个许可证 Release():释放占用的许可证具体使用看下面的示例代码:?12345678910111213141516171
阅读全文
C#中为多线程变量提供原子操作的类Interlocked
摘要:最近在工作中经常用到了多线程来处理问题,但是关于多线程共享变量的问题就需要解决了。还好.net为我们提供了InterLocked类,它可是微软专门为多个线程共享的变量提供原子操作的类。我们经常用到的方法之一是Interlocked.Increment()和Interlocked.Decrement()。如下是MSDN上关于这2个方法的介绍:Increment 和Decrement 方法递增或递减变量并将结果值存储在单个操作中。在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤:将实例变量中的值加载到寄存器中。增加或减少该值。在实例变量中存储该值。如果不使用 Increment .
阅读全文
一个实例明白AutoResetEvent和 ManulResetEvent的用法
摘要:先看一段代码:public class WaitHandlerExample {public static AutoResetEvent waitHandler;public static ManualResetEvent manualWaitHandler;public static void ThreadPoolMain() {waitHandler = new AutoResetEvent(false);manualWaitHandler = new ManualResetEvent(false);// Queue the task.ThreadPool.QueueUserWorkIte
阅读全文