今天我想拿出我对多线程的理解和大家来学习一下.net framework之下是如何完成的。
System.Threading:
基本上与线程相关的信息,也就在这个命名空间里可以找的了。
1. 如何创建一个线程。
... {
private int[] PublicResource = new int[100];
private void ThreadFunc()
...{
for(int i = 0; i< 100; i++)
...{
lock(PublicResource)
...{
PublicResource[i] = i + 1;
}
}
}
public void GetThread()
...{
Thread _Thread = new Thread(new ThreadStart(ThreadFunc));
}
private Thread _Thread = null;
public void StartThread()
...{
GetThread();
_Thread.Start();
}
public void StopThread()
...{
if (_Thread != null && _Thread.IsAlive)
...{
_Thread.Abort();
_Thread.Join();
}
}
}
记住在传给线程构造函数的参数是一个委托,尽管在net.20里将函数指针直接作为参数传递,但是我不建议大家这么做,而且,你如果你看生成IL代码,你也会发现.net2.0其实也是在内部用委托封装了的,因为CLR规范根本就不允许函数指针这样的不安全带码,即便要有也必须有unsafe关键字指明。
2. 如何启动一个线程
利用方法Start函数就可以直接启动
3. 如何终止?
看到_Thread.Abort()了吗?这个方法将在线程内部引发一个异常ThreadAbortException,终止进程,而Join()方法将会等待,直到线程结束。
现在你已经学会了如何创建,启动和停止线程,然而,这些只是最最基本的知识,下面我们将一起学习如何同步一个线程,.net framework提供很多种方法来同步线成,比如上面代码里的lock关键字就是一种较为简单并且很实用的方式。lock关键字将保护程序块在在执行的时候免受其他线程的干扰。对于他的更多信息你可以参考MSDN,因为这里我只准备介绍一些基本的知识。
类似的还有如InnerLock等等,这里我想主要介绍一下信号量的使用方法:
a. AutoRestEvent:
通知正在等待的线程事件已经发生。
线程通过调用 AutoResetEvent 上的WiteOne来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用Set发出资源可用的信号。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。
AutoResetEvent 也可以同 staticWaiteAll 和WaiteAny 方法一起使用。
b. MannualResetEvent
通知一个或多个正在等待的线程已发生事件.
与AutoRestEvent不同的是,它必须人为的设置信号量。
恩,写不动了,下次继续