Windows编程之线程同步

来源:互联网 发布:数据采集器怎么用 编辑:程序博客网 时间:2024/05/16 14:26


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


0 0
原创粉丝点击