C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
2013-07-15 20:26
986 查看
线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一般情况下,应用程序使用主线程接受用户输入,显示运行结果,而创建新的线程来处理长时间的操作。
每个线程必须拥有一个进入点函数,线程从这个进入点开始运行,主线程的进入点是函数main。
线程函数定义:
DWORD WINAPI ThreadProc(LPVOIDlpParam);//线程名称ThreadProc可以是任意的
创建新线程的函数是CreateThread,由这个函数创建的线程将在调用者的虚拟地址空间内执行,函数的用法如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,//线程的安全属性
DWORD dwStackSize,//指定线程堆栈的大小
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数的起始地址(执行线程的函数)
LPVOIDlpParameter,//传给线程函数的参数
DWORD dwCreationFlags,//指定创建线程后是否立即启动
DWORD* pdwThreadId //取得内核给新生成的线程分配的线程ID号
);
此函数执行成功后,将返回新建线程的线程句柄。pfnThreadProc新建线程将从此地址开始执行,知道return语句返回,线程运行结束,把控制权交给操作系统。
例子:
运行结果:
WaitForSingleObject(handle,INFINITE);//等待线程执行结束
会等到线程执行结束后才执行调用线程的,比如线程A启动了线程B,在线程A中遇到了WaitForSingleObject函数时,会一直等到B线程执行结束,才会继续执行A线程,如果没有这条语句,线程A和线程B是"同时"执行的(这个同时是指我们以为的,不是真正CPU同时执行2个线程)
CloseHandle(handle);//关闭线程
释放内存
TerminateThread(HANDLE,DWORD)终止一个线程HANDLE线程的句柄,DWORD退出代码
WaitForSingleObject例子:
每个线程必须拥有一个进入点函数,线程从这个进入点开始运行,主线程的进入点是函数main。
线程函数定义:
DWORD WINAPI ThreadProc(LPVOIDlpParam);//线程名称ThreadProc可以是任意的
创建新线程的函数是CreateThread,由这个函数创建的线程将在调用者的虚拟地址空间内执行,函数的用法如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,//线程的安全属性
DWORD dwStackSize,//指定线程堆栈的大小
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数的起始地址(执行线程的函数)
LPVOIDlpParameter,//传给线程函数的参数
DWORD dwCreationFlags,//指定创建线程后是否立即启动
DWORD* pdwThreadId //取得内核给新生成的线程分配的线程ID号
);
此函数执行成功后,将返回新建线程的线程句柄。pfnThreadProc新建线程将从此地址开始执行,知道return语句返回,线程运行结束,把控制权交给操作系统。
例子:
#include<Windows.h> #include<iostream> using namespace std; DWORD WINAPI TestThread(LPVOID); int main(void) { DWORD rd; HANDLE handle= CreateThread(NULL,NULL,TestThread,NULL,0,&rd);//打开新的线程 cout<<rd<<endl;//显示线程ID //为了能看出两个线程同时在运行,多输出几条语句 for(int i=0;i<10;i++) { cout<<"main wait"<<i<<"....."<<endl; } CloseHandle(handle);//关闭线程(就像关闭申请的内存) cin.get(); return 0; } //测试线程(线程的入口点,如程序的main函数一样) DWORD WINAPI TestThread(LPVOID lpParam) { cout<<"这是我的第一个多线程C++程序"<<endl;//为了能看出两个线程同时在运行,多输出几条语句 for(int i=0;i<10;i++) { cout<<"thread wait"<<i<<"...."<<endl; } return 0; }
运行结果:
WaitForSingleObject(handle,INFINITE);//等待线程执行结束
会等到线程执行结束后才执行调用线程的,比如线程A启动了线程B,在线程A中遇到了WaitForSingleObject函数时,会一直等到B线程执行结束,才会继续执行A线程,如果没有这条语句,线程A和线程B是"同时"执行的(这个同时是指我们以为的,不是真正CPU同时执行2个线程)
CloseHandle(handle);//关闭线程
释放内存
TerminateThread(HANDLE,DWORD)终止一个线程HANDLE线程的句柄,DWORD退出代码
WaitForSingleObject例子:
#include<Windows.h> #include<iostream> using namespace std; DWORD WINAPI TestThread(LPVOID); int main(void) { DWORD rd; HANDLE handle= CreateThread(NULL,NULL,TestThread,NULL,0,&rd);//打开新的线程 cout<<rd<<endl;//显示线程ID WaitForSingleObject(handle,INFINITE);//等待线程执行结束 //为了能看出两个线程同时在运行,多输出几条语句 for(int i=0;i<10;i++) { cout<<"main wait"<<i<<"....."<<endl; } //CloseHandle(handle);//关闭线程(就像关闭申请的内存) cin.get(); return 0; } //测试线程(线程的入口点,如程序的main函数一样) DWORD WINAPI TestThread(LPVOID lpParam) { cout<<"这是我的第一个多线程C++程序"<<endl;//为了能看出两个线程同时在运行,多输出几条语句 for(int i=0;i<10;i++) { cout<<"thread wait"<<i<<"...."<<endl; } return 0; }
相关文章推荐
- 多线程问题,三个线程轮流进行,每个线程进行n次操作,共执行n*n*3次操作。本代码用三军攻击做演示,通俗易懂。
- AIX 主机性能工具 本地目录/home/duty/nmon_aix52 执行后,按t键, 列出最耗CPU资源的前几十位进程的 进程号以及描述信息。结果一看是oracle的进程占了大半。
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- 利用Windows性能计数器分析软件产品的性能瓶颈
- Intel软件大会——提高多核cpu windows应用程序性能,高性能计算优化(待改)
- 获得进程/线程已经被分配的所有cpu时间片的总和
- Python GIL 系列之通过设置进程运行的CPU来提高Python程序的性能(续)
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- 初识:如何实现利用C语言代码封装成可以安装的windows软件?
- 多核CPU并不能让进程的多条线程同时执行
- 利用用户级线程提高多线程应用的性能
- 利用用户级线程提高多线程应用的性能
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- Python GIL 系列之通过设置进程运行的CPU来提高Python程序的性能
- Java中的线程会按照优先级分配CPU时间片运行,那么线程什么时候放弃CPU使用权?
- 利用远程线程将代码注入到目标进程中执行
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- Kivy A to Z -- 通过绑定进程运行CPU提高Python程序在多核CPU平台上的性能
- windows进程限制工具,可以限制其它软件只能运行一个
- 【小工具】windows进程限制工具,可以限制其它软件只能运行一个 最新版本V1.2.0