c++ 初识多线程
在计算机操作系统中,线程是最小的执行单元。用户编程时,为了完成一项功能,可以使用多线程技术创建多个线程共同完成某一项功能。这种方法比单线程要快。
现在大多CPU都只支持单线程,多线程程序能运行的原因是系统程序为每一个线程都分配了执行时间,这个执行时间非常短,感觉好像是同时进行的。
用户编程时,首先要创建线程。可以调用API函数CreateThread,函数原型为
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
参数说明:
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
dwStackSize:线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress:指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
CREATE_SUSPENDED: 创建一个挂起的线程
0 :创建后立即激活。
lpThreadId:保存新线程的id。
返回值:
函数成功,返回线程句柄;函数失败返回false。
函数说明:
创建一个线程。语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
下面展示一个实例
#include<iostream>
#include<windows.h>
using namespace std;
DWORD WINAPI fun1(LPVOID lpParameter) //进程函数接口
{
cout << "线程1 运行中" << endl;
return 0;
}
DWORD WINAPI fun2(LPVOID lpParameter)
{
cout << "线程2 运行中" << endl;
return 0;
}
int main()
{
HANDLE h1, h2; //定义句柄
h1 = ::CreateThread(NULL, 0, fun1, NULL, 0, NULL); //创建线程1
cout << "线程1开始运行" << endl;
h2 = ::CreateThread(NULL, 0, fun2, NULL, 0, NULL); //创建线程2
cout << "线程2开始运行" << endl;
::CloseHandle(h1); //关闭线程句柄对象
::CloseHandle(h2);
while (1)
{
if (getchar() == 'q')
{
return 0;
}
else
{
::Sleep(100);
}
}
return 0;
}
运行结果为:
线程1开始运行
线程2开始运行
线程2 运行中
线程1 运行中