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