多线程互斥

考虑多线程的变量访问

// 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 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值