1. 程式人生 > >Windows程式設計之執行緒同步

Windows程式設計之執行緒同步


Windows程式設計中執行緒同步的主要機制:互斥、事件、訊號量、可等待定時器,不說了,直接上程式碼:

// ThreadSync.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <windows.h>

#define TEST_EVENT_NAME TEXT("TEST_EVENT")
#define TEST_MUTEX_NAME TEXT("TEST_MUTEX")
#define TEST_SEMAPHORE_NAME TEXT("TEST_SEMAPHORE")
#define TEST_WATIABLETIME_NAME TEXT("TEST_TIMER")

void myprintf(char* p)
{
	printf("ThreadId: %d, %s\n", GetCurrentThreadId(), p);
}


HANDLE CreateSyncObject(int flag)
{
	HANDLE hObj = NULL;
	switch (flag)
	{
	case 1:
		myprintf("Use Event!");
		hObj = CreateEvent(NULL, TRUE, FALSE, TEST_EVENT_NAME);
		break;
	case 2:
		myprintf("Use Mutex!");
		hObj = CreateMutex(NULL, FALSE, TEST_MUTEX_NAME);
		break;
	case 3:
		myprintf("Use Semaphore!");
		hObj = CreateSemaphore(NULL, 0, 2, TEST_SEMAPHORE_NAME);
		break;
	case 4:
		myprintf("Use WatiableTimer!");
		hObj = CreateWaitableTimer(NULL, FALSE, TEST_WATIABLETIME_NAME);
		break;
	default:
		break;
	}
	return hObj;
}

HANDLE OpenSyncObject(int flag)
{
	HANDLE hObj = NULL;
	switch (flag)
	{
	case 1:
		myprintf("Open Event!");
		hObj = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEST_EVENT_NAME);
		break;
	case 2:
		myprintf("Open Mutex!");
		hObj = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEST_MUTEX_NAME);
		break;
	case 3:
		myprintf("Open Semaphore!");
		hObj = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, TEST_SEMAPHORE_NAME);
		break;
	case 4:
		myprintf("Open WatiableTimer!");
		hObj = CreateWaitableTimer(NULL, FALSE, TEST_WATIABLETIME_NAME);
		break;
	default:
		break;
	}
	return hObj;
}

DWORD __stdcall ThrdFun1(LPVOID p)
{
	HANDLE hObj = OpenSyncObject((int)p);
	DWORD dwFlag;
	LONG lCount = 0;
	switch ((int)p)
	{
	case 1:
		dwFlag = WaitForSingleObject(hObj, INFINITE);
		myprintf("Thrd1 Wait Success!");
		ResetEvent(hObj);
		break;
	case 2:
		dwFlag = WaitForSingleObject(hObj, INFINITE);
		myprintf("Thrd1 Wait Success!");
		Sleep(2000);
		ReleaseMutex(hObj);
		break;
	case 3:
		dwFlag = WaitForSingleObject(hObj, INFINITE);
		myprintf("Thrd1 Wait Success!");
		Sleep(2000);
		ReleaseSemaphore(hObj, 1, &lCount);
		break;
	default:
		break;
	}
	myprintf("Thrd1 Exit!");
	return 0;
}

DWORD __stdcall ThrdFun2(LPVOID p)
{
	HANDLE hObj = OpenSyncObject((int)p);
	DWORD dwFlag;
	LONG lCount = 0;
	switch ((int)p)
	{
	case 1:
	    Sleep(2000);
		SetEvent(hObj);
		break;
	case 2:
		dwFlag = WaitForSingleObject(hObj, INFINITE);
		myprintf("Thrd2 Wait Success!");
		Sleep(2000);
		ReleaseMutex(hObj);
		break;
	case 3:
		//dwFlag = WaitForSingleObject(hObj, INFINITE);
		myprintf("Thrd2 Wait Success!");
		Sleep(2000);
		ReleaseSemaphore(hObj, 1, &lCount);
		break;
	default:
		break;
	}	
	myprintf("Thrd2 Exit!");
	return 0;
}

void CALLBACK TimeProc(LPVOID pArg, DWORD dwTimeLow, DWORD dwTimeHigh)
{
	printf("ThreadId: %d, Time: %d %d\n", GetCurrentThreadId(), dwTimeLow, dwTimeHigh);
}

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD dwThrdId1, dwThrdId2;
	HANDLE h1, h2, hObj;
	for (int i = 1; i < 1; ++i)
	{
		hObj = CreateSyncObject(i);
		h1 = CreateThread(NULL, 0, ThrdFun1, (LPVOID)i, 0, &dwThrdId1);
		h2 = CreateThread(NULL, 0, ThrdFun2, (LPVOID)i, 0, &dwThrdId2);
		WaitForSingleObject(h1, INFINITE);
		WaitForSingleObject(h2, INFINITE);
		CloseHandle(hObj);
		CloseHandle(h1);
		CloseHandle(h2);
	}

	HANDLE hTime = CreateSyncObject(4);
	LARGE_INTEGER liTime;
	liTime.QuadPart = -10000000;
	DWORD dwTick;
	BOOL b = SetWaitableTimer(hTime, &liTime, 2000, TimeProc, NULL, FALSE);
	while (1)
	{
		dwTick = GetTickCount();
		SleepEx(INFINITE, TRUE);
		//WaitForSingleObject(hTime, INFINITE);
		dwTick = GetTickCount() - dwTick;
	}
	WaitForSingleObject(hTime, INFINITE);
	CloseHandle(hTime);
	printf("Time Wait Success!\n");
	system("@pause");
	return 0;
}