📄 threadmonitorworking.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 + -