C语言Windows下多线程编程入门
#include <stdio.h>#include <process.h>#include <windows.h>#include "base.h"#define MAX_RETRY_COUNT 3HANDLE 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;}??执行结果如下:
