c++学习 | 多线程

学习资料: VC驿站 - www.cctry.com
教程在线观看地址:https://www.bilibili.com/video/av39728551/?p=1


前言

  本套课程是讲解 Windows 多线程方面的相关操作。对于新手来说非常适合,对于线程方面从基础到高级部分都有讲解。包括线程的创建、销毁、同步,以及MFC中工作线程和界面线程的区别于联系等等,非常不错哦。


一、认识与创建线程

1. 什么是多线程编程

  一边听音乐,一边上网;一边下载东西,一遍看电影,等等,都是多线程的功劳;

2.线程与进程的关系

  线程是进程的可执行单元,是计算机分配CPU机时的基本单元。一个进程可以包含一个或多个线程,进程是通过线程去执行代码的。

  同一个进程的多个线程共享该进程的资源和操作系统分配给该进程的内存空间。每个进程必须有一个主线程,主线程退出之后该进程也就退出了。
一个进程的主线程是由系统创建的。

  在单CPU中,表面上看好像是多个进程中的多个线程共同执行,实际上是操作系统根据调度规则、依次的 将一个一个的线程可执行代码加载进CPU中执行的;
即,CPU在同一时刻只能执行一段代码,由于CPU的频率非常快,迅速的在各个线程间进行切换,所以给人的感觉就好像是多个线程共同执行。

  不过在多核CPU的电脑中,确实是多个线程共同执行……

  所以,通过多线程,一个进程的应用程序可以充分利用CPU资源,但什么事情都是物极必反,如果线程开的太多,系统就会增加额外的开销去进行线程的调度,
反而降低了CPU的使用效率。

3.创建新线程的三种方式

方式一:CreateThread(记得关闭线程句柄)
CreateThread函数参数详解

方式二:AfxBeginThread(会自动释放的,不用你去释放)

方式三:_beginthreadex(记得关闭线程句柄)

4.AfxBeginThread 函数

CWinThread* AfxBeginThread(
					AFX_THREADPROC 			pfnThreadProc,		//线程函数地址
				   	LPVOID 					pParam,				//线程参数
				   	int 					nPriority = THREAD_PRIORITY_NORMAL,	//线程优先级
				   	UINT 					nStackSize = 0,		//线程堆栈大小,默认为1M
				  	DWORD 					dwCreateFlags = 0,	//创建标识,CREATE_SUSPENDED悬挂状态创建
				   	LPSECURITY_ATTRIBUTES 	lpSecurityAttrs = NULL //安全属性
);
  • pfnThreadProc : 线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL;
  • pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.
  • nPriority : 线程的优先级,一般设置为 0 。让它和主线程具有共同的优先级.
  • nStackSize : 指定新创建的线程的栈的大小。如果为 0,新创建的线程具有和主线程一样的大小的栈
  • dwCreateFlags : 指定创建线程以后,线程有怎么样的标志。可以指定两个值:
        CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用ResumeThread。
        0 : 创建线程后就开始运行。
  • lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL,那么新创建的线程就具有和主线程一样的安全性。

5.几种方式创建线程的使用情况

1.win32 SDK API的程序 使用方式一
2.基于FMC的程序,使用方式二
3.c,c++编程中,使用方式三

6.程序例子

UINT _cdecl ThreadProc(LPVOID IpParameter)
{
	int tipMsg = (int)IpParameter;
	return 0;
}


void CSprDlg::OnBnClickedButton1()
{
	CWinThread *pThread =  AfxBeginThread(ThreadProc, (LPVOID)456, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);

	return;
}

调试结果 *pThread
在这里插入图片描述

二、线程的运行状态

①、我们的程序到底是不是多线程运行的?有什么优点呢?

  加个 Sleep(1000*10) 便知分晓,即对于一些比较耗时的操作,更建议使用多线程的方式!

②、线程是否真的在执行呢?

  调试打印方式判断:OutputDebugString

③、线程函数调用主对话框类的成员:

  线程函数的参数起着决定性作用!

④、类的成员函数做为线程函数:

  https://www.cctry.com/thread-19591-1-1.html


总结

以上就是今天要讲的内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值