#include <stdio.h> #include <windows.h> int i = 0, sum = 0; CRITICAL_SECTION gcs; DWORD WINAPI ThreadFunc(LPVOID lpParam)//定义线程函数 { int ThreadNum = *((int *)lpParam);//看看是哪个线程 while (i <= 1000) { //printf("Thread %d:sum=%d\n",ThreadNum,sum); EnterCriticalSection(&gcs);//进入临界区,以下内容只能一个线程调用 i++; if (i <= 1000)//忽略最后十个等待的线程 { sum += i; printf("Thread %d:sum=%d\n", ThreadNum, sum); } LeaveCriticalSection(&gcs);//离开临界区 } return 0; } int main()//10个线程,有临界区,访问公共变量的只有一个线程(实现1到1000累加) { InitializeCriticalSection(&gcs);//初始化临界区 int n;//用作迭代 // DWORD dwThrdParam[10];//定义10个线程函数参数 DWORD dwThreadId[10] = { 0 };//线程ID HANDLE hThread[10];//定义10个保存线程句柄的变量 for (n = 0; n < 10; n++) hThread[n] = CreateThread(NULL, 0, ThreadFunc, &n, 0, NULL);//创建十个线程 WaitForMultipleObjects(10, hThread, TRUE, INFINITE);//等待十个线程结束 DeleteCriticalSection(&gcs);//删除临界区 CloseHandle(hThread); printf("sum=%d\n", sum); return 0; }
实现的是从1加到1000