```cpp
#pragma once
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <process.h>
using namespace std;
class MultiThreads
{
public:
MultiThreads():m_listenThread1(NULL),
m_listenThread2(NULL),
threadId(0),
threadId2(0),
sharedRes(0)
{}
~MultiThreads()
{}
VOID init()
{
m_listenThread1 = (HANDLE)_beginthreadex(nullptr, 0, listenThread1, this, 0, &threadId);
if (m_listenThread1 == NULL)
{
printf("%s failed.[%d]\n", __FUNCTION__, __LINE__);
return;
}
m_listenThread2 = (HANDLE)_beginthreadex(nullptr, 0, listenThread2, this, 0, &threadId2);
if (m_listenThread2 == NULL)
{
printf("%s failed.[%d]\n", __FUNCTION__, __LINE__);
return;
}
WaitForSingleObject(m_listenThread1, INFINITE);
WaitForSingleObject(m_listenThread2, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeThread(m_listenThread1, &dwExitCode);
printf("listenThread1 exit with code %d\n", dwExitCode);
GetExitCodeThread(m_listenThread2, &dwExitCode);
printf("listenThread2 exit with code %d\n", dwExitCode);
CloseHandle(m_listenThread1);
CloseHandle(m_listenThread2);
}
static UINT WINAPI listenThread1(VOID* arglist)
{
MultiThreads* mthr = reinterpret_cast<MultiThreads*>(arglist);
while (mthr->sharedRes < 100)
{
InterlockedExchangeAdd(&mthr->sharedRes, 1);
printf("%d,%lld\n", GetCurrentThreadId(), mthr->sharedRes);
Sleep(10);
}
return 0;
}
static UINT WINAPI listenThread2(PVOID arglist)
{
MultiThreads* mthr = reinterpret_cast<MultiThreads*>(arglist);
while (mthr->sharedRes < 100)
{
InterlockedExchangeAdd(&mthr->sharedRes, 1);
printf("%d,%lld\n", GetCurrentThreadId(), mthr->sharedRes);
Sleep(10);
}
return 0;
}
public:
volatile ULONGLONG sharedRes;
private:
volatile HANDLE m_listenThread1, m_listenThread2;
UINT threadId, threadId2;
};