多线程编程:简单的多线程编程



# <windows.h> //『注意1』由于CreateThread是API所以必须包含这个头文件

# <iostream>

using std;



DWORD WINAPI Thread1Proc( LPVOID lpParameter); //线程执行

DWORD WINAPI Thread2Proc( LPVOID lpParameter); //线程执行



a;

b;

c;

temp(0);

sum(0);





{



a=1;

b=2;

c=3;

HANDLE hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL); //『注意2』创建线程1

HANDLE hThread2=CreateThread(NULL,0,Thread2Proc,NULL,0,NULL); //创建线程2

CloseHandle(hThread1); //关闭标识线程1句柄

CloseHandle(hThread2); //关闭标识线程2句柄

Sleep(5); //『注意3』主线程放弃执行权睡眠毫秒以使线程和线程得到执行机会

sum=temp; //主线程执行语句

cout<<"sum="<<sum<<endl; //主线程执行语句

0;

}



DWORD WINAPI Thread1Proc( LPVOID lpParameter)

{

temp=a+b;

0;

}



DWORD WINAPI Thread2Proc( LPVOID lpParameter)

{

tempc;

0;

}

代码介绍说明:本代码简单演示了多线程创建思路方法用包括主线程在内 3个线程共同完成sum=a+b+c并输出计算结果功能其中线程1完成a+b这线程2完成将a+b结果和c相加这主线程完成输出计算结果这整个很简单目了然但是依然有几个地方需要注意:

『注意1』由于创建线程所使用CreateThread是windows API所以必须包含头文件windows.h

『注意2』CreateThread个HANDLE 类型返回值用来标识创建线程因此应该定义个HANDLE类型变量用于保存这个句柄(不是必须)线程创建完成的后如果不需要使用这个句柄变量应当将其关闭以释放系统资源关闭句柄思路方法是CloseHandle

『注意3』这里Sleep作用是使主线程放弃执行机会让其它线程开始执行这个主线程内运行代码很短就两条短语句同常情况这两条语句在个系统时间片内就能跑完然后就执行语句返回主线程就运行结束了主线程结束就终止线程1和线程2将再也得不到执行机会我们可以将Sleep注释起来然后运行观察打印出来sum值即可以发现线程1和线程2是否得到运行机会当然Sleep不是必须这从系统调度线程方式可以看出来多线程在开始运行时系统会首先让主线程执行段时间(时间片)如果主线程在这个时间段内将所有代码都执行完了就结束否则就将主线程挂起然后让其他线程执行同样段时间时间到了的后该线程挂起又返回主线程开始执行主线程再执行同样段时间然后再挂起跳到其他线程执行如此不断循环直到主线程完全执行完毕为止由此可见要想让非主线程能够被完整执行那么只要使它获得时间片总和大于或等于该线程连续执行完毕所需要时间即可基于此原理我们想到只要让主线程被多次挂起即可使非主线程获得多个执行时间片那么如何让主线程多次被挂起呢?很简单只要让主线程连续执行完毕所需要时间是系统时间片N倍即可具体N等于多少合适那需要视其他线程完整执行需要多少时间我们实验Sleep那行代码注释起来然后在那里写上如下代码:

//Sleep(5);

for( i=0;i<1000000;i){}

这个for循环什么事也不做就是延长主线程执行时间使主线程在个时间片里执行不完分成在若干个时间片里执行运行可以发现输出sum值等于6符合预期介绍说明线程1和线程2都得到了执行
Tags:  win32多线程编程 delphi多线程编程 linux多线程编程 多线程编程

延伸阅读

最新评论

发表评论