看《C#线程参考手册》
2007-10-29 00:13 buru 阅读(816) 评论(0) 收藏 举报
看到第二章,暂时知道的有:
一个个线程在寄存器中是以队列的形式排列的,但是执行的时候并不是按顺序,而是由操作系统非配一个固定的时间片段来个每个线程,一个线程在一个时间段执行完以后就排到队列最后,cpu执行下一个线程。
以前经常用的Thread.Sleep方法其实是使当前线程睡眠掉。
有时候多线程执行效率较高,但cpu非配线程也会消耗一定资源。
ThreadStart委托的函数是没有参数的,所以有参数的情况下需要建立一个代理的类。
如果把工作放到队列中,并且应该使用多线程,就可以考虑使用线程池。
但是不管任何情况下,尽量使线程数目最少。这样会减少开销,增加用来处理线程中指令的时间量,减少应用程序的内存。
---------------------
Threading.ReadWriteLock类:
在类中的一个ReadWriteLock实例成员,可以获取读取或写的锁,读取字段值的时候就不能写入,写入字段值的时候就不能读取。读取可以几个线程一起,写只能一个线程获得锁。
--------------几个用于手动同步的类---------------
同步就是操作线程执行指令的顺序。
AutoResetEvent :WaitOne()后会改变状态。
ManualResetEvent : WaitOne不会改变状态.与AutoReSetEvent一样用来使线程处于等待状态,通过Set()方法某事件将它置于有信号(即waitone值为true)。Reset()将使之无信号。
Mutex:类似Monitor类,有ReleaseMutex来释放锁。
然后waitone()执行结果true,继续运行。否则会抛出异常。
using System;
using System.Threading;
namespace Threads
{
class WroxMutex
{
static Mutex myMutex;
public static void Main()
{
myMutex = new Mutex(true,"WROX");
WroxMutex nm = new WroxMutex();
Thread t = new Thread(new ThreadStart(nm.Run));
t.Start();
Console.WriteLine("Thread Sleep for 5 sec");
Thread.Sleep(5000);
Console.WriteLine("Thread Woke Up");
myMutex.ReleaseMutex();
Console.WriteLine("Befor WaitOne");
myMutex.WaitOne( );
Console.WriteLine("Lock owned by Main Thread");
}
public void Run()
{
Console.WriteLine("In Run");
myMutex.WaitOne();
Console.WriteLine("Thread sleeping for 10 secs");
Thread.Sleep(10000);
Console.WriteLine("End of Run() Method");
myMutex.ReleaseMutex();
}
}
}
Interlocked:同步访问一个由许多线程共享的变量。
namespace Threads
{
class WorxInterLocked
{
public ManualResetEvent a = new ManualResetEvent(false);
private int i = 5;
public void Run(object s)
{
Interlocked.Increment(ref i);//递增 1.
//i++;
Console.WriteLine("{0} {1}", Thread.CurrentThread.GetHashCode(), i);
}
}
public class MainAPP
{
public static void Main()
{
ManualResetEvent mR = new ManualResetEvent(false);
WorxInterLocked wL = new WorxInterLocked();
for (int i = 1; i <= 10; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(wL.Run), 1);
}
mR.WaitOne(10000,true);
}
}
}


浙公网安备 33010602011771号