声明:本文参考http://blog.csdn.net/morewindows/article/details/7442333
程序描述:
主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。
要求:
1.子线程输出的线程序号不能重复。
2.全局变量的输出必须递增。
主要考察点有二个:
1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。
2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。
#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++;
}
WaitForMultipleObjects(THREAD_NUM,handle,TRUE,INFINITE);
return 0;
}
unsigned int __stdcall Fun(void* pPM)
{
int nThreadNum =*(int*)pPM;
Sleep(50);
g_nNum++;
Sleep(0);
printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);
return 0;
}