多线程的创建问题

线程与进程的回顾

        已知进程是线程执行程序的容器,进程只是为线程的执行提供一个执行环境。真正执行程序的是线程,每个进程至少拥有一个线程,当创建一个进程时,那么系统会自动创建一个线程,称为主线程,也就是执行main函数或WinMain函数的线程,该函数是程序的入口函数,此后,主线程创建其他线程。

单线程与多线程的区别

对单线程来说,在进程的地址空间中只有一个线程在运行。
对多线程来说,在进程地址空间中有多个线程在运行。
当程序移植到多CPU的平台上时,其中的多个线程就可以真正并发的同时运行了,可以大大提高运行效率。

创建线程函数

C++本身并没有提高多线程的机制,我们可以使用windows下的win32 SDK   CreateThread   API函数进行编写多线程程序。
CreateThread函数 - 该函数将创建一个线程。该函数的原型声明如下:
HANDLE CreateThread(  LPSECURITY_ATTRIBUTES lpsa,  //指向安全属性的指针,这里可以为其传递NULL,让该线程使用默认的安全属性。</span>
 <span style="white-space:pre">	</span> DWORD cbStack, //设置线程初始栈的大小,即线程可以将多少地址空间用于它自己的栈,以字节为单位。如果该值为0,这默认将使用与调用该函数的线程相同的栈空间大小。
   <span style="white-space:pre">	</span> LPTHREAD_START_ROUTINE lpStartAddr,//表明为新线程的起始地址。</span>
<span style="white-space:pre">	</span> LPVOID lpvThreadParam, //通过该参数给创建的新线程传递参数。该参数提供了一个将初始化值传递给线程函数的手段,这个参数可以是一个数值也可以是一个指向其他信息的指针。
<span style="white-space:pre">	</span> DWORD fdwCreate,//用于控制线程创建的附加标记。它可以是两个值中的一个:CREATE_SUSPENDED或0.如果为CREATE_SUSPENDED则线程创建之后处于暂停状态,直到程序调用了ResumeThread函数为止;如果为0则立刻执行。</span>
<span style="white-space:pre">	</span> LPDWORD lpIDThread); //该参数是一个返回值,它指向一个变量,用于接收线程ID。该参数可以为NULL。</span>
lp StartAddr表示为新线程的起始地址,是一个LPTHREAD_START_ROUTINE类型的函数指针,这个函数由新线程执行,表明新线程的起始地址。我们知道main函数是主线程的入口函数,同样,一个新线程也需要一个入口函数,那么lpStartAddr就是该入口函数的指针。这就要求在程序中建立一个函数作为新线程的入口函数,该函数的名称可以是任意的,但函数必须遵守以下声明形式。
DWORD ThreadProc( 
LPVOID lpParameter);
    该函数只有一个LPVOID参数和一个返回值DWORD类型。其中该参数用于接收传递参数。
    以下是一个简单多线程示例:

#include<windows.h>
using namespace std;

DWORD WINAPI Fun1Proc(  LPVOID lpParameter);
int main(int argc, char* argv[])
{
	HANDLE hThread;
	hThread = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
	CloseHandle(hThread);
	Sleep(100);
	cout<<"main thread is running!"<<endl;

	return 0;
}
DWORD WINAPI Fun1Proc(  LPVOID lpParameter)
{
	cout<<"Thread1 is running!"<<endl;
	return 0;
}</span>
        在创建线程之后,调用CloseHandle函数关闭新线程的句柄并没关闭新生成的线程,只是表示主线程对新创建的线程的句柄不感兴趣,因此将其关闭,关闭该句柄视为了让系统递减该线程内核对象的使用计数,当使用计数为0时,系统会释放该线程内核对象。如果没有关闭线程句柄,系统就会一直这样保持对线程内核对象的引用,浪费系统空间,但是在进程终止时,系统也会清理这些残留的对象,将其关闭。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值