您的位置:首页 > 其它

多线程互斥

2016-02-25 17:33 155 查看
考虑多线程的变量访问

// 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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程