赞
踩
问题:怎么让1个应用程序中的2个“函数”看起来好像是同时在运行呢?
—— 线程;
问题:怎么让2个“应用程序”看起来好像是在同一个处理器中同时运行呢?
—— 进程;
虚拟:指的是对于每个应用程序来说,它的地址空间自己看上去好像是无限宽广!
实际上,同一时间,只有1个CPU,只有1个寄存器组!
MMU的作用:将每个应用程序的“虚拟地址”映射到真正的“物理地址”上!通过MMU我们将1个处理器,编程多个“假的处理器”!
多线程的作用:让1个程序里面的多个函数一起跑起来!!!
各个线程以“轮转”的方式平等占用处理器一段时间(这个时间可能是100 ms)。
问题:假设的售票大厅共有10个售票员,150张票,请模拟10个售票员同时售卖150张票的情形!
模拟代码(非并行):
void SellTickets(int agentID, int numTicketsToSell) { while(numTicketsToSell > 0) { printf("Agent %d sells a ticket\r\n", agentID), numTicketsToSell--; } printf("Agent %d: All Down\r\n", agentID); } int main() { uint8_t agent; int numAgents = 10; // 10个售票员 int numTickets = 150; // 150 张票 for(agent = 0; agent < numAgents; agent++) { SellTickets(agent, numTickets / numAgents); } return 0; }
预计结果:160行printf输出!这些票是从第0位售票员开始,依次到第1位售票员、第2位售票员……第9位售票员,1张1张地卖出去的,并不是10个售票员同时售票!!!这样做,10个人弄得跟1个人一样!!!效率太低了!!!
我们肯定希望,10个售票员同时往出买票。
需求:需要寻找1个线程库,来帮助你实现“线程”!
多线程的意义在于,1个线程在被阻塞的时候,另1个线程还可以运行!你想想啊,最开始学单片机的时候,有个叫“软件延时的”,这是纯粹消耗机器周期以进行延时。在“软件延时”的过程中,CPU干不了别的事情,它只能在那里干等着!这不是浪费资源嘛!
<process.h>
序号 | 函数名 | 功能 |
---|---|---|
1 | _beginthread() | 创建1个新线程(简洁版) |
2 | _endthread() | 销毁1个线程(简洁版) |
3 | _beginthreadex() | 创建1个新线程(全面版) |
4 | _endthreadex() | 销毁1个线程(全面版) |
<windows.h>
序号 | 函数名 | 功能 |
---|---|---|
1 | ResumeThread() | 恢复线程的运行 |
2 | SuspendThread() | 挂起线程 |
3 | GetExiCodeThread() | 得到1个线程的退出码 |
4 | WaitForSingleObject() | 等待1个对象 |
5 | WaitForMultipleObjects() | 等待多个对象 |
<process.h> 中提供了2种创建线程的方式!1个简洁版本的 _beginthread(),这个获取不了子线程的ID号;另1个是全面版本的 _beginthreadex(),这个可以获取子线程的ID号!!!
_CRTIMP uintptr_t __cdecl _beginthread(void (__cdecl *_StartAddress) (void *),
unsigned int _StackSize,
void *_ArgList);
_CRTIMP uintptr_t __cdecl _beginthreadex(void *_Security,
unsigned int _StackSize,
unsigned int (__stdcall *_StartAddress) (void *),
void *_ArgList,
unsigned int _InitFlag,
unsigned int *_ThrdAddr);
typedef
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。