#include <Windows.h> #include <iostream> #include <cstdlib> #include <ctime> #include <process.h> using namespace std; class CAsyncData { public: CAsyncData(int nData = 0) { m_nData =nData; } ~CAsyncData() { } public: void Plus(int nPlus) { InterlockedExchangeAdd(&m_nData, nPlus); } int GetData() { return m_nData; } private: volatile LONG m_nData; }; class CAsyncPrint { public: CAsyncPrint() { InitializeCriticalSection(&m_stCrtSection); } ~CAsyncPrint() { DeleteCriticalSection(&m_stCrtSection); } public: void AsyncPrintString(const char* lpszBuf, ...) { char szBuf[1024 * 8] = {0}; va_list vals = NULL; EnterCriticalSection(&m_stCrtSection); va_start(vals, lpszBuf); vsprintf(szBuf, lpszBuf, vals); va_end(vals); cout << szBuf << endl; LeaveCriticalSection(&m_stCrtSection); } private: CRITICAL_SECTION m_stCrtSection; }; //gloab function declare unsigned __stdcall AddThreadProc(LPVOID); //gloal object CAsyncData g_objAsyData; CAsyncPrint g_objAsyPrint; int main() { //set rand number seed srand((unsigned int)time(NULL)); //crate two thread _beginthreadex(NULL, 0, AddThreadProc, NULL, 0, NULL); _beginthreadex(NULL, 0, AddThreadProc, NULL, 0, NULL); while (TRUE) { Sleep(1000); } } unsigned __stdcall AddThreadProc(LPVOID) { int nRand = 0; char szPrint[MAX_PATH] = {0}; while (TRUE) { nRand = rand(); //before add _snprintf(szPrint, MAX_PATH - 1, "before plus. data value = %ld", g_objAsyData.GetData()); g_objAsyPrint.AsyncPrintString(szPrint); g_objAsyData.Plus(nRand); _snprintf(szPrint, MAX_PATH - 1, "after plus rand = %d data value = %ld", nRand, g_objAsyData.GetData()); g_objAsyPrint.AsyncPrintString(szPrint); Sleep(1000); } return 0; }