多线程入门(1),volatile(C#)关键字

     多线程应用程序,可以提高程序的响应速度,也就提高了用户的体验。在多用户或者有耗时操作时,使用多线程提高程序的响应速度是不二的选择。一个程序员不懂多线程,不是一个合格的程序员。所以,哥也要学习多线程了。

构建一个简单的多线程程序

1using System;
2using System.Threading;
3
4namespace CSharpConsoleTestingCodes
5{
6    class Program
7    {
8        static void Main(string[] args)
9        {
10            Worker worker = new Worker();
11            //创建辅助线程
12            Thread td = new Thread(worker.DoWork);//new Thread(worker.DoWork())这样编写编译错误。
13            td.Start();//开启辅助线程并与主线程并行工作
14            Console.WriteLine("main thread starting the working thread... ...");          
15            while (!td.IsAlive) ;//等待辅助线程进入工作状态。
16            //Thread.Sleep(1);//让主线程Sleep 1ms,以让辅助线程做一些工作;效果:图1
17            for (int i = 0; i < 4; i++)//在主线程中同时进行一些工作;效果:图2
18                Console.WriteLine("Doing some work in the main thread... ...");
19            worker.StopWorking();//告诉辅助线程停止工作。
20            td.Join();//使用join()方法阻塞当前线程直到辅助线程退出。
21            Console.WriteLine("Main thread: the worker thread has terminated!");
22            Console.ReadLine();
23        }

24    }

25    class Worker
26    {
27        private volatile bool mShouldStop=false;//volatile变量,作为是否退出DoWork()的标记,可以被辅助线程和主线程访问
28        public void DoWork()//模拟某耗时工作,一直打印消息直到工作完成(mShouldStop被主线程改为ture)时结束。
29        {
30            while (!mShouldStop)
31                Console.WriteLine("Doing somework in the aided thread... ... ");
32            Console.WriteLine("Quit the aided thread gracefully... ...");
33        }

34        public void StopWorking()//结束工作,由主线程调用。
35        {
36            this.mShouldStop = true;
37        }

38    }

39}

40

       以上就是一个简单的多线程程序。由于注释比较详细就不一一讲解了。

执行结果如图(结果不会完全一样,因为线程切换的时间和顺序是不定的):





不过有几点是要注意的:

  • 创建线程时使用的代码为 Thread td = new Thread(worker.DoWork);  而不是DoWork(),初学者容易写为  new Thread(worker.DoWork()); 这是因为在Thread的构造函数中使用的是ThreadStart类型的委托,可以理解为C中的函数指针,传递给线程执行。 以后我们会发现,多线程中委托是很重要的角色。
  • Worker类中的mShouldStop数据成员被声明为了 volatile ,因为这个变量同时被主线程和辅助线程访问和修改。以下是MSDN上的解释:

    volatile 关键字用于通知编译器,将有多个线程访问 mShouldStop 数据成员,因此它不应当对此成员的状态做任何优化假设。有关更多信息,请参见 volatile(C# 参考)

    通过将 volatilemShouldStop 数据成员一起使用,可以从多个线程安全地访问此成员,而不需要使用正式的线程同步技术,但这仅仅是因为 mShouldStop bool。这意味着只需要执行单个原子操作就能修改 mShouldStop 。但是,如果此数据成员是类、结构或数组,那么,从多个线程访问它可能会导致间歇的数据损坏。假设有一个更改数组中的值的线程。Windows 定期中断线程,以便允许其他线程执行,因此线程会在分配某些数组元素之后和分配其他元素之前被中断。这意味着,数组现在有了一个程序员从不想要的状态,因此,读取此数组的另一个线程可能会失败。

  • 最后使用Join()方法结束辅助线程。以下是MSDN上的解释:

    还可以通过调用 Abort 来从一个线程终止另一个线程,但这会强行终止受影响的线程,而不管它是否已完成自己的任务,并且不提供清理资源的机会。此示例中显示的技术是首选方法。

    最后,Main 函数对辅助线程对象调用 Join 方法。此方法导致当前线程阻塞或等待,直到对象所表示的线程终止。因此,直到辅助线程返回后,Join 才会返回,然后自行终止

posted @ 2010-05-20 11:23  Cat_Lee  阅读(1284)  评论(0编辑  收藏  举报