`
wujierd
  • 浏览: 45754 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对一段代码的一些注释

 
阅读更多
该博主真的是很牛逼。代码来自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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics