该博主真的是很牛逼。代码来自http://blog.csdn.net/morewindows/article/details/7442333
//经典线程同步互斥问题
#include <stdio.h>
#include <process.h>
#include <windows.h>
long g_nNum; //全局资源
unsigned int __stdcall Fun(void *pPM); //线程函数
const int THREAD_NUM = 10; //子线程个数
int main()
{
g_nNum = 0;
HANDLE handle[THREAD_NUM];
int i = 0;
while (i < THREAD_NUM)
{
handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
i++;//等子线程接收到参数时主线程可能改变了这个i的值 主线程会在子线程1、2、3等没有执行结束时来访问这里,也就是并不是等到线程1执行结束了,再创建线程2.所以线程X在Fun函数输出nThreadNum,i++已经被执行多次了。
}
//保证子线程已全部运行结束
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
return 0;
}
unsigned int __stdcall Fun(void *pPM) //pPM是一个指针地址,是0xabf2343542,这样的,不是int型,不是double型。
{
//由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来
int nThreadNum = *(int *)pPM; //子线程获取参数
Sleep(50);//some work should to do
g_nNum++; //处理全局资源 子线程可以一窝蜂的来访问这里,子线程1执行到printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum);这一句的时候,g_nNum++已经被执行多次了,g_nNum的值不在是1了。
Sleep(0);//some work should to do
printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum);
return 0;
}