Listing 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();
}