⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadmonitorworking.cpp

📁 Visual_C++[1].NET_Bible1 Visual_C++宝典书中的全部源码
💻 CPP
字号:
#include "stdafx.h"

#using <mscorlib.dll>
#include <tchar.h>

using namespace System;
using namespace System::Threading;

__gc class CTicketDispenser
{
protected:
  static int m_iNextTicket = 1;
public:
  __property int get_NextTicket()
  {
    Monitor::Enter(this);

    int iNextTicket = m_iNextTicket;
    Thread::CurrentThread->Sleep(100);

    m_iNextTicket = m_iNextTicket + 1;
    Thread::CurrentThread->Sleep(100);

    Monitor::Exit(this);

    return iNextTicket;
  }
};

__gc class CWorkerThread
{
public:
  CWorkerThread(int iThreadId, CTicketDispenser* pTicketDispenser)
    : m_iThreadId(iThreadId), m_pTicketDispenser(pTicketDispenser)
  {
    m_pThread = new Thread(new ThreadStart(this, &CWorkerThread::ThreadMethod));
  }

protected:
  CTicketDispenser* m_pTicketDispenser;

protected:
  int m_iThreadId;
public:
  __property int get_Id()
  {
    return m_iThreadId;
  }

protected:
  Thread* m_pThread;
public:
  void Start()
  {
    if (m_pThread)
    {
      m_pThread->Start();
    }
  }

  void ThreadMethod()
  {
    Console::WriteLine("[CWorkerThread::ThreadMethod] ID {0} gets ticket {1}", 
      __box(m_iThreadId),
      __box(m_pTicketDispenser->NextTicket));
  }
};

// This is the entry point for this application
int _tmain(void)
{
  CTicketDispenser* pTicketDispenser = new CTicketDispenser();
  for (int i = 1; i < 6; i++)
  {
    Console::WriteLine("[_tmain] Starting thread {0}", __box(i));
    CWorkerThread* pThread = new CWorkerThread(i, pTicketDispenser);
    pThread->Start();
  }

  Thread::CurrentThread->Sleep(2000);
  Console::WriteLine("[_tmain] The current next ticket value is {0}",
    __box(pTicketDispenser->NextTicket));

  Console::ReadLine();
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -