快速业务通道

实例解析C++/CLI线程之线程状态持久性

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
个快照存储在一个非易变的变量中,我们就可以安全地多次使用这个值了--因为它的值不可能在"后台"改变。在此,使用volatile,可避免对特定类型变量的显式异步访问。

线程局部存储

当编写多线程应用程序时,只在特定的线程中使用特定的变量,这是一个非常好的习惯,请看例3的程序:

例3:

using namespace System;
using namespace System::Threading;
public ref class ThreadX
{
  /*1*/ int m1;
  /*2*/ static int m2 = 20;
  /*3*/ [ThreadStatic] static int m3 = 30;
  public:
   ThreadX()
   {
    m1 = 10;
   }
 
   void TMain()
   {
    String^ threadName = Thread::CurrentThread->Name;
    /*4*/ Monitor::Enter(ThreadX::typeid);
    for (int i = 1; i <= 5; ++i)
    {
     ++m1;
     ++m2;
     ++m3;
    }
    Console::WriteLine("Thread {0}: m1 = {1}, m2 = {2}, m3 = {3}",
threadName, m1, m2, m3);
    Monitor::Exit(ThreadX::typeid);
  }
};
int main()
{
  /*5*/ Thread::CurrentThread->Name = "t0";
  ThreadX^ o1 = gcnew ThreadX;
  Thread^ t1 = gcnew Thread(gcnew ThreadStart(o1, &ThreadX::TMain));
  t1->Name = "t1";
  ThreadX^ o2 = gcnew ThreadX;
  Thread^ t2 = gcnew Thread(gcnew ThreadStart(o2, &ThreadX::TMain));
  t2->Name = "t2";
  t1->Start();
  /*6*/ (gcnew ThreadX)->TMain();
  t2->Start();
  t1->Join();
  t2->Join();
}

m1是一个实例字段,所以每个ThreadX的实例都有一份各自的拷贝,且在父类对象的生命期中都会存在;而另一方面,m2是一个类字段,所以对类来说,不管有几个类的实例,它只有单独的一个,从理论上来说,它将会一直存在,直到程序结束。但这两个字段都不是特定于某个线程的,如果以适当的构造,这两种类型的字段都能被多个线程访问。

简单来说,线程局部存储就是特定线程拥有的某段内存,这段内存在新线程创建时被分配,而在线程结束时被释放,它结合了局部变量的私有性和静态变量的持久性。通过指定ThreadStatic属性,可把一个字段标记为线程局部类型,如例中的标记3所示,在成为静态字段之后,m3甚至还能有一个初始化函数。

函数TMain为新线程的入口点,这个函数只是简单地递增这三个变量:m1、m2和m3,每回5次,并打印出它们当前的值。标记4中的同步锁保证了在这些字段递增或打印时,另一个线程不会同时访问它们。

在标记5中,主线程把它的名字设置为t0,接着创建并启动了两个线程,另外,它也把TMain当作了一个普通函数直接调用,而不是作为创建的新线程的一部分来调用。程序的输出请见插2。

插2:

Thread t0: m1 = 15, m2 = 25, m3 = 35
Thread t1: m1 = 15, m2 = 30, m3 = 5
Thread t2: m1 = 15, m2 = 35, m3 = 5

每个线程都有其自己的m1实例,它被初始化为10,所以在递增5次之后,每个线程中的值都为15。而m2则有所不同,所有的三个线程都共享同一变量,所以这一变量被递增了15次。

线程t1与t2在经过线程创建过程之后,每个都有其自己的m3,然而,这些线程局部变量会被赋予默认的零值,而不是在源代码中初始化的30,注意了,在经过5次递增之后,各个值均为5,而线程t0则有所不同,正如我们所看到的,这个线程不是由创建其他两个线程同样的机制创建的,所以,它的m3会接受显式初始化的值30。同时也请注意标记6,TMain作为一个普通函数被调用,而不是作为创建的新线程的一部分。

原子性与互锁操作

如果存在这样一种情况:一个应用程序有多个线程并行运行,每个线

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号