Listing 1

using namespace System;
using namespace System::Threading;

public ref class ThreadX
{
  int loopStart;
  int loopEnd;
  int dispFrequency;
public:
  ThreadX(int startValue, int endValue, int frequency)
  {
    loopStart = startValue;
    loopEnd = endValue;
    dispFrequency = frequency;
  }

/*1*/ void ThreadEntryPoint()
  {
/*2*/   String^ threadName = Thread::CurrentThread->Name;
    
    for (int i = loopStart; i <= loopEnd; ++i)
    {
      if (i % dispFrequency == 0)
      {
        Console::WriteLine("{0}: i = {1,10}", threadName, i);
      }
    }
    Console::WriteLine("{0} thread terminating", threadName);
  }
};

int main()
{
/*3a*/  ThreadX^ o1 = gcnew ThreadX(0, 1000000, 200000);
/*3b*/  Thread^ t1 = gcnew Thread(gcnew ThreadStart(o1, &ThreadX::ThreadEntryPoint));
/*3c*/  t1->Name = "t1";

/*4a*/  ThreadX^ o2 = gcnew ThreadX(-1000000, 0, 200000);
/*4b*/  Thread^ t2 = gcnew Thread(gcnew ThreadStart(o2, &ThreadX::ThreadEntryPoint));
/*4c*/  t2->Name = "t2";

/*5*/ t1->Start();
/*6*/ t2->Start();
  Console::WriteLine("Primary thread terminating");
}