C语言Windows上多线程编程入门
C语言Windows下多线程编程入门
#include <stdio.h> #include <process.h> #include <windows.h> #include "base.h" #define MAX_RETRY_COUNT 3 HANDLE workThread; HANDLE prtThread; void *workThrEntry(void *param); void *prtThrEntry(void *param); unsigned int workThrId; unsigned int prtThrId; BOOL isWorkThrAlive = BOOL_FALSE;//工作线程是否存活 HANDLE workThrAliveSem;//工作线程是否存活的信号量 RESULT startPrtThread(); RESULT startWorkThread(); void setWorkThrAlive(BOOL b); BOOL getWorkThrAlive(); void main(void) { workThrAliveSem = CreateSemaphore(NULL,1,1,(LPCWSTR)"Sem for work thread alive parameter!"); if (SUCCESS == startPrtThread()) { startWorkThread(); } WaitForSingleObject(prtThread,INFINITE); CloseHandle(prtThread); CloseHandle(workThread); CloseHandle(workThrAliveSem); } RESULT startWorkThread() { workThread = (HANDLE)_beginthreadex(NULL,0,(unsigned int (_stdcall *)(void *))workThrEntry,0,0,&workThrId); if (NULL == workThread) { printf("ERROR: Create work thread failed!\n"); setWorkThrAlive(BOOL_FALSE); return FAILURE; } else { printf("INFO: Create work thread succeed!\n"); return SUCCESS; } } RESULT startPrtThread() { prtThread = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void *))prtThrEntry,0,0,&prtThrId); if (NULL == prtThread) { printf("ERROR: Create print thread failed!\n"); return FAILURE; } else { printf("Info: Create print thread succeed!\n"); return SUCCESS; } } void *workThrEntry(void *param) { setWorkThrAlive(BOOL_TRUE); while (1) { } setWorkThrAlive(BOOL_FALSE); return NULL; } /** * 每秒针检测工作线程是否退出,没退出则打印相关信息。 **/ void *prtThrEntry(void *param) { int retryCount = 0; BOOL isFirstPrint = BOOL_TRUE; while (1) { if (BOOL_FALSE == getWorkThrAlive()) { if (MAX_RETRY_COUNT == retryCount) { printf("INFO: The work thread has extied!\n"); break; } else { Sleep(500); retryCount++; continue; } } if (BOOL_TRUE == isFirstPrint) { printf("Running..."); isFirstPrint = BOOL_FALSE; } else { printf("."); } Sleep(500); } return NULL; } void setWorkThrAlive(BOOL b) { WaitForSingleObject(workThrAliveSem,INFINITE); isWorkThrAlive = b; ReleaseSemaphore(workThrAliveSem,1,NULL); } BOOL getWorkThrAlive() { BOOL b; WaitForSingleObject(workThrAliveSem,INFINITE); b = isWorkThrAlive; ReleaseSemaphore(workThrAliveSem,1,NULL); return b; }
执行结果如下: