您的位置:首页 > 编程语言 > C语言/C++

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语句返回,线程运行结束,把控制权交给操作系统。
例子:

#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐