#
![](/icons/4525include.gif)
<windows.h> //『注意1』由于CreateThread
![](/icons/4525kh.gif)
是API
![](/icons/4525hanshu.gif)
![](/icons/4525dou.gif)
所以
![](/icons/4525dou.gif)
必须包含这个头文件
#
![](/icons/4525include.gif)
<iostream>
using
![](/icons/4525namespace.gif)
std;
DWORD WINAPI Thread1Proc( LPVOID lpParameter); //线程
![](/icons/4525de.gif)
执行
DWORD WINAPI Thread2Proc( LPVOID lpParameter); //线程
![](/icons/4525de.gif)
执行
![](/icons/4525int.gif)
a;
![](/icons/4525int.gif)
b;
![](/icons/4525int.gif)
c;
![](/icons/4525int.gif)
temp(0);
![](/icons/4525int.gif)
sum(0);
![](/icons/4525main.gif)
{
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
![](/icons/4525de.gif)
句柄
CloseHandle(hThread2); //关闭标识线程2
![](/icons/4525de.gif)
句柄
Sleep(5); //『注意3』主线程放弃执行权
![](/icons/4525dou.gif)
睡眠毫秒
![](/icons/4525dou.gif)
以使线程和线程得到执行机会
sum=temp; //主线程
![](/icons/4525de.gif)
执行语句
cout<<"sum="<<sum<<endl; //主线程
![](/icons/4525de.gif)
执行语句
![](/icons/4525return.gif)
0;
}
DWORD WINAPI Thread1Proc( LPVOID lpParameter)
{
temp=a+b;
![](/icons/4525return.gif)
0;
}
DWORD WINAPI Thread2Proc( LPVOID lpParameter)
{
temp
![](/icons/4525jiadeng.gif)
c;
![](/icons/4525return.gif)
0;
}
代码介绍说明:本代码简单演示了多线程
![](/icons/4525de.gif)
创建思路方法
![](/icons/4525dou2.gif)
![](/icons/4525chengxu.gif)
用包括主线程在内
![](/icons/4525de.gif)
3个线程共同完成sum=a+b+c并输出计算结果
![](/icons/4525de.gif)
功能
![](/icons/4525dou2.gif)
其中
![](/icons/4525dou.gif)
线程1完成a+b这
![](/icons/4525yi.gif)
步
![](/icons/4525dou.gif)
线程2完成将a+b
![](/icons/4525de.gif)
结果和c相加这
![](/icons/4525yi.gif)
步
![](/icons/4525dou.gif)
主线程完成输出计算结果这
![](/icons/4525yi.gif)
步
![](/icons/4525dou2.gif)
整个
![](/icons/4525chengxu.gif)
很简单
![](/icons/4525dou.gif)
![](/icons/4525yi.gif)
目了然
![](/icons/4525dou.gif)
但是
![](/icons/4525dou.gif)
依然有几个地方需要注意:
『注意1』由于创建线程所使用
![](/icons/4525de.gif)
![](/icons/4525hanshu.gif)
CreateThread
![](/icons/4525kh.gif)
是windows API
![](/icons/4525hanshu.gif)
![](/icons/4525dou.gif)
所以
![](/icons/4525dou.gif)
必须包含头文件windows.h
『注意2』CreateThread
![](/icons/4525kh.gif)
![](/icons/4525hanshu.gif)
有
![](/icons/4525yi.gif)
个HANDLE 类型
![](/icons/4525de.gif)
返回值
![](/icons/4525dou.gif)
用来标识创建
![](/icons/4525de.gif)
线程
![](/icons/4525dou.gif)
因此
![](/icons/4525dou.gif)
应该定义
![](/icons/4525yi.gif)
个HANDLE类型
![](/icons/4525de.gif)
变量用于保存这个句柄(不是必须)
![](/icons/4525dou2.gif)
线程创建完成的后
![](/icons/4525dou.gif)
如果不需要使用这个句柄变量
![](/icons/4525dou.gif)
应当将其关闭
![](/icons/4525dou.gif)
以释放系统资源
![](/icons/4525dou2.gif)
关闭句柄
![](/icons/4525de.gif)
思路方法是
![](/icons/4525diaoyong.gif)
CloseHandle
![](/icons/4525kh.gif)
![](/icons/4525hanshu.gif)
『注意3』这里
![](/icons/4525de.gif)
Sleep
![](/icons/4525kh.gif)
![](/icons/4525hanshu.gif)
![](/icons/4525de.gif)
作用是使主线程放弃执行机会
![](/icons/4525dou.gif)
让其它线程开始执行
![](/icons/4525dou2.gif)
![](/icons/4525yinwei.gif)
这个
![](/icons/4525chengxu.gif)
主线程内运行
![](/icons/4525de.gif)
代码很短
![](/icons/4525dou.gif)
就两条短语句
![](/icons/4525dou.gif)
同常情况
![](/icons/4525dou.gif)
这两条语句在
![](/icons/4525yi.gif)
个系统时间片内就能跑完
![](/icons/4525dou.gif)
然后就执行
![](/icons/4525return.gif)
语句返回
![](/icons/4525dou.gif)
主线程就运行结束了
![](/icons/4525dou2.gif)
主线程
![](/icons/4525yi.gif)
结束
![](/icons/4525dou.gif)
![](/icons/4525chengxu.gif)
就终止
![](/icons/4525dou.gif)
线程1和线程2将再也得不到执行机会
![](/icons/4525dou2.gif)
我们可以将Sleep
![](/icons/4525kh.gif)
注释起来
![](/icons/4525dou.gif)
然后运行
![](/icons/4525chengxu.gif)
![](/icons/4525dou.gif)
观察打印出来
![](/icons/4525de.gif)
sum值即可以发现线程1和线程2是否得到运行机会
![](/icons/4525dou2.gif)
当然
![](/icons/4525dou.gif)
Sleep
![](/icons/4525kh.gif)
不是必须
![](/icons/4525de.gif)
![](/icons/4525dou.gif)
这从系统调度线程
![](/icons/4525de.gif)
方式可以看出来
![](/icons/4525dou.gif)
多线程
![](/icons/4525chengxu.gif)
在开始运行时
![](/icons/4525dou.gif)
系统会首先让主线程执行
![](/icons/4525yi.gif)
段时间(时间片)
![](/icons/4525dou.gif)
如果主线程在这个时间段内将所有代码都执行完了
![](/icons/4525dou.gif)
![](/icons/4525chengxu.gif)
就结束
![](/icons/4525dou.gif)
否则
![](/icons/4525dou.gif)
就将主线程挂起
![](/icons/4525dou.gif)
然后让其他线程执行同样
![](/icons/4525de.gif)
![](/icons/4525yi.gif)
段时间
![](/icons/4525dou.gif)
时间到了的后
![](/icons/4525dou.gif)
该线程挂起
![](/icons/4525dou.gif)
又返回主线程开始执行
![](/icons/4525dou.gif)
主线程再执行同样
![](/icons/4525de.gif)
![](/icons/4525yi.gif)
段时间
![](/icons/4525dou.gif)
然后再挂起
![](/icons/4525dou.gif)
跳到其他线程执行
![](/icons/4525dou.gif)
如此不断循环
![](/icons/4525dou.gif)
直到主线程完全执行完毕为止
![](/icons/4525dou2.gif)
由此可见
![](/icons/4525dou.gif)
要想让非主线程能够被完整执行
![](/icons/4525dou.gif)
那么只要使它获得
![](/icons/4525de.gif)
时间片
![](/icons/4525de.gif)
总和大于或等于该线程连续执行完毕所需要
![](/icons/4525de.gif)
时间即可
![](/icons/4525dou2.gif)
基于此原理
![](/icons/4525dou.gif)
我们想到
![](/icons/4525dou.gif)
只要让主线程被多次挂起即可使非主线程获得多个执行时间片
![](/icons/4525dou2.gif)
那么
![](/icons/4525dou.gif)
如何让主线程多次被挂起呢?很简单
![](/icons/4525dou.gif)
只要让主线程连续执行完毕所需要
![](/icons/4525de.gif)
时间是系统时间片
![](/icons/4525de.gif)
N倍即可
![](/icons/4525dou.gif)
具体N等于多少合适
![](/icons/4525dou.gif)
那需要视其他线程完整执行需要多少时间
![](/icons/4525dou2.gif)
我们实验
![](/icons/4525yi.gif)
下
![](/icons/4525dou.gif)
把
![](/icons/4525diaoyong.gif)
Sleep
![](/icons/4525kh.gif)
那行代码注释起来
![](/icons/4525dou.gif)
然后在那里写上如下代码:
//Sleep(5);
for(
![](/icons/4525int.gif)
i=0;i<1000000;i
![](/icons/4525jiajia.gif)
){}
这个for循环什么事也不做
![](/icons/4525dou.gif)
就是延长主线程
![](/icons/4525de.gif)
执行时间
![](/icons/4525dou.gif)
使主线程在
![](/icons/4525yi.gif)
个时间片里执行不完
![](/icons/4525dou.gif)
分成在若干个时间片里执行
![](/icons/4525dou2.gif)
运行
![](/icons/4525chengxu.gif)
![](/icons/4525dou.gif)
可以发现
![](/icons/4525dou.gif)
输出
![](/icons/4525de.gif)
sum值等于6
![](/icons/4525dou.gif)
符合预期
![](/icons/4525dou.gif)
介绍说明
![](/icons/4525dou.gif)
线程1和线程2都得到了执行
延伸阅读
- 2011-9-1-- java并发编程,Java 多线程与并发编程总结
- 2010-11-24-- 多线程,闲话"多线程
- 2011-4-18-- 多线程服务器,[转载]多线程服务器的常用编程模型
- 2010-11-24-- 多线程,.NET多线程的探讨
- 2010-11-24-- 多线程,闲话"多线程
- 2010-11-24-- 多线程,C#多线程学习(二) 如何操纵一个线程
- 2011-7-25-- 多线程编程,Linux多线程编程(不限Linux)
- 2011-7-13-- java多线程,Java多线程编程
- 2011-3-28-- 多线程,记事 - 多线程
- 2010-11-24-- 批量定时上架,【原创】c#实现用SQL池(多线程),定时批量执行SQL语句
最新评论