考虑多线程的变量访问
// threadTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
DWORD WINAPI childThreadProc( LPVOID lpParam );
DWORD WINAPI childThreadProc2( LPVOID lpParam );
DWORD WINAPI mainThreadProc( LPVOID lpParam );
#define CREATE_THREAD_SAFE() \
{ \
ghMutex = CreateMutex(NULL, FALSE, NULL); \
}
#define DESTROY_THREAD_SAFE() \
{ \
CloseHandle(ghMutex); \
}
#define THREAD_SAFE_LOCK() \
{ \
WaitForSingleObject(ghMutex, INFINITE); \
}
#define THREAD_SAFE_UNLOCK() \
{ \
ReleaseMutex(ghMutex); \
}
typedef struct MyData {
int nThreadIndex;
HANDLE hThreandHandle;
} MYDATA, *PMYDATA;
int gnCounter;
HANDLE ghMutex;
//test1
HANDLE ghThread[10] = {0};
//test2
HANDLE ghThreadChild;
HANDLE ghThreadMain;
void threadTest1();
void threadTest2();
int _tmain(int argc, _TCHAR* argv[])
{
//threadTest1();
threadTest2();
//ResumeThread(hThread);
//SuspendThread(hThread);
system("pause");
return 0;
}
void threadTest1()
{
gnCounter = 0 ;
DWORD dwThreadID[10] = {0};
MyData* pData[10];
int i=0;
ghMutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex
for(i=0; i<10; i++)
{
pData[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
pData[i]->nThreadIndex = i;
ghThread[i] = CreateThread(NULL, 0, childThreadProc, pData[i], 0, NULL);
}
WaitForMultipleObjects(10, ghThread, true, INFINITE);
for( i=0; i < 10; i++ )
CloseHandle(ghThread[i]);
}
void threadTest2()
{
gnCounter = 0 ;
CREATE_THREAD_SAFE();
ghThreadMain = CreateThread(NULL, 0, mainThreadProc, 0, CREATE_SUSPENDED,0);
ghThreadChild = CreateThread(NULL, 0, childThreadProc2, NULL, 0, NULL);
WaitForSingleObject(ghThreadChild, INFINITE);
CloseHandle(ghThreadMain);
CloseHandle(ghThreadChild);
DESTROY_THREAD_SAFE();
}
DWORD WINAPI childThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
THREAD_SAFE_LOCK();
for(int i=0;i<20;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThread[data->nThreadIndex], gnCounter);
}
THREAD_SAFE_UNLOCK();
return 0;
}
DWORD WINAPI childThreadProc2( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop1>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadMain);
SuspendThread(ghThreadChild);
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("[%d]loop2>>Handle:%d, child thread [%d], counter=%d\n", sumCnt, GetCurrentThreadId(), ghThreadChild, gnCounter);
}
THREAD_SAFE_UNLOCK();
}
return 0;
}
DWORD WINAPI mainThreadProc( LPVOID lpParam )
{
MyData* data = (MyData*)lpParam;
for(int sumCnt=0; sumCnt<20; sumCnt++)
{
THREAD_SAFE_LOCK();
for(int i=0;i<10;i++)
{
gnCounter++;
printf("Handle:%d, child thread [%d], counter=%d\n", GetCurrentThreadId(), ghThreadMain, gnCounter);
}
THREAD_SAFE_UNLOCK();
ResumeThread(ghThreadChild);
SuspendThread(ghThreadMain);
}
return 0 ;
}