秒杀多线程第四篇 一个经典的多线程同步问题 .
参考博客:http://blog.csdn.net/morewindows/article/details/7442333
主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。
1 #include <stdio.h> 2 #include <process.h> 3 #include <windows.h> 4 long g_num; //登录次数 5 unsigned int __stdcall Fun(void *pPM); //线程函数 6 const DWORD THREAD_NUM = 10;//启动线程数 7 unsigned int __stdcall Fun(void *pPM) 8 { 9 //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来 10 int nThreadNum = *(int *)pPM; //子线程获取参数 11 Sleep(50);//some work should to do 12 g_num++; //处理全局资源 13 // InterlockedIncrement(&g_num); 14 Sleep(0);//some work should to do 15 printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_num); 16 return 0; 17 } 18 int main() 19 { 20 printf(" 原子操作 Interlocked系列函数的使用\n"); 21 g_num = 0; 22 HANDLE handle[THREAD_NUM]; 23 int i=0; 24 while (i<THREAD_NUM) 25 { 26 handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); 27 i++; 28 } 29 30 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); 31 return 0; 32 }
输出结果不固定