网络程序设计——VC的多线程编程(线程与进程)

2023-05-16

目录

一、线程与进程

1、线程

2、引用线程的原因

3、线程与进程的关系 

 4、线程的特点

二、线程函数的参数传递

三、多线程与单线程的区别

 四、线程创建函数_beginthread()和_beginthreadex()

五、终止线程函数

一、线程与进程

1、线程

      当从一个进程切换到另一个进程时,需要保护当前进程的状态(主要是虚拟内存映像,文件描述符,寄存器内容等),并恢复将要运行的进程的状态,这不仅消耗CPU的执行时间,还要占用较多的存储空间。

线程是进程内部的一个执行单元。它只是简单地扩展了进程切换的概念,它从进程间的切换转变成了同一个进程内的函数间的切换。

2、引用线程的原因

    为了减少进程切换时的时空开销,使操作系统具有更好的并发性,人们在操作系统中又引入了线程的概念。 

3、线程与进程的关系 

     ① 同一个进程中函数间的切换相对于进程来说所需的开销要小的多,它只需要保存少数几个寄存器、一个堆栈指针以及程序计数器等少量内容。

     ② 线程实现了进程内的并发性。在支持线程的操作系统中,一个进程内至少有一个线程,称为主线程,它无需由用户去主动创建,是由系统自动创建的。系统创建好进程后,实际上就启动执行了该进程的主线程。

     ③进程中除主线程外还可以有多个子个线程。子线程是用户根据需要创建的。

多个线程之间可以并发执行(包括主线程和各级子线程),一个线程可以创建和撤消另一个线程。

 4、线程的特点

由于线程之间的相互制约,致使线程在运行中呈现出间断性。

线程也有就绪、阻塞和运行三种基本状态。

     ① 同一进程中的多线程通常各自完成不同的工作,可以实现并行处理,避免了某项任务长时间占用CPU时间。

     比如:一个线程负责通过网络收发数据,另一个线程完成所需的计算工作,第三个线程来做文件输入输出,当其中一个由于某种原因阻塞后(比如通过网络收发数据的线程等待对方发送数据),另外的线程仍然能执行而不被阻塞。

     ② 线程自己不独自拥有系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

      ③一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用该虚拟地址空间中的全局变量和系统资源,所以线程间的通讯非常方便。

二、线程函数的参数传递

1、创建线程时可以给线程传递一个LPVOID类型的参数,该参数为CreateThread()函数的第四个参数。

2、当参数为一个整型数据时,可将该整型数据强制转换为LPVOID类型,作为实参直接传递给线程函数。

3、当参数为一个字符串时,则创建线程时的实参传递既可以使用字符数组,也可以使用CString类。使用字符数组时,实参可直接使用字符数组名或指向字符数组的char* 指针;使用CString类时,可将指向CString对象的指针强制转换为LPVOID。

4、如果需要向线程传送多个数值时,由于线程函数的参数只有一个,所以需要先将它们封装在一个结构体变量中,然后将该变量的指针作为参数传给线程函数。

三、多线程与单线程的区别

多线程运行时库与单线程运行时库有两个重大差别:

(1)类似errno的全局变量,每个线程单独设置一个;这样从每个线程中可以获取正确的错误信息。

(2)多线程库中的数据结构以同步机制加以保护。这样可以避免访问时候的冲突。

注:errno变量

        为防止和正常的返回值混淆,C/C++语言的系统调用一般并不直接返回错误码,而是将错误码存入一个名为 errno 的全局变量中,errno 变量以及各种不同错误码的定义均在 <errno.h> 文件中。

        如果一个系统调用或库函数调用失败,可以通过读出 errno 的值来确定问题所在,推测程序出错的原因。

 四、线程创建函数_beginthread()和_beginthreadex()

unsigned long  _beginthread

(
   void( __cdecl *start_address )( void * ), //指向新线程调用的函数
   unsigned stack_size,  //新线程堆栈的大小,可为0
   void *arglist  //传递给线程的参数列表,可为NULL
);

unsigned long _beginthreadex

(
         void *security, //指向SECURITY_ATTRIBUTES结构,用于决定返回句柄能否被继承
     unsigned stack_size,
         unsigned (__stdcall * pfnStartAddr) (void *) ,
         void *arglist,
     unsigned initflag,  //若为0,线程立即执行,CREATE_SUSPENDED,则挂起
        unsigned *thrdaddr   //存放线程ID

); 

五、终止线程函数

       在线程内部停止_beginthread()或_beginthreadex()创建的线程,可分别使用_endthread()函数和_endthreadex()函数,这两个函数的格式如下:

void _endthread( void );
void _endthreadex( unsigned retval ); 
//参数retval为线程的退出代码。

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络程序设计——VC的多线程编程(线程与进程) 的相关文章

随机推荐

  • 操作系统—分段与分页

    1 地址重定位 所谓的地址重定位 xff08 也叫地址翻译 xff09 就是修改程序中的内存地址 xff0c 使得程序被载入内存后 xff0c 那些地址能够指向正确的内存空间 例如 xff0c 程序中包含 call 40 语句 xff0c
  • putty连接被拒的原因分析

    1 xff1a 检查防火墙 2 xff1a PING虚拟机 3 xff1a SSHD etc init d sshd start开启服务 4 xff1a IP字段问题 ifconfig eth0 新IP xff08 更改为字段和主机一样的I
  • Charles+Postern抓包遇到的问题(已解决)

    问题描述 Charles的代理配置和Postern的代理配置的都是正确的 xff0c 但是当在手机上打开Postern中的开启VPN时 xff0c Charles上没有任何反应 解决方法 xff1a 我在多次配置实验无果的情况下 xff08
  • 4. ROS编程入门--PID控制器

    介绍 xff1a 这篇教程是交给大家怎么在ROS里写一个PID控制器 xff0c PID控制器有三部分 比例部分 xff08 P xff09 积分部分 xff08 I xff09 微分部分 xff08 D xff09 PID的输出是这三部分
  • 6. ROS编程入门--路径跟随(Trajectory following)

    Task 本次实验才采用 Follow the carrot 算法去跟随定义好的路径 控制的目标点在机器人行走的路径上 xff0c 距离机器人是个常数距离 机器人计算自己的方向角和目标点角度之间的相差度数 控制这个差角为0 为了在探测时候能
  • 位姿矩阵求逆

    位姿矩阵求逆 位姿矩阵分析位姿矩阵求逆矩阵 为了更好的说明问题 xff0c 我们先来看一下位姿矩阵的定义 位姿矩阵分析 如下图所示 xff1a 如果在B坐标系下有一点PB xff0c 我们需要知道该点在坐标系A下的坐标PA xff0c 怎么
  • UNIX环境高级编程

    环境配置 1 下载apue 3e文件夹 xff0c 可以通过http www apuebook com code3e html现在源码 2 解压后执行进入apue 3e中执行make指令 如果出现 96 96 96 collect2 err
  • C#连接SQL Server 数据库

    C 是如何跟SQL Server进行连接的 xff1f 在C NET程序设计中 xff0c 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 xff0c ADO NET还可以访问Oracle数
  • 冒烟测试和回归测试的区别

    每次新的版本出来的时候 xff0c 老大就让我们 冒烟 虽然不知道冒烟测试的含义 xff0c 但由于没有给用例 xff0c 我就随便跑跑 跑完冒烟后 xff0c 老大就让做 回归测试 xff0c 把bug回归掉 但是其实对2个概念还是不太理
  • Webpack——02——打包html资源

    1 在src中创建webpack的入口文件index js xff0c index html 2 src的同级目录下创建webpack config js 3 下载插件html webpack plugin 老规矩 初始化 xff0c 下w
  • AT&T 汇编

    1 基础 x86 的寄存器为32位 xff0c x64 的寄存器为64位 寄存器间对应关系 xff1a 64位寄存器 低32位 低16位 低8位 rax eax ax al rbx ebx bx bl rcx ecx cx cl rdx e
  • 向导对话框[转]

    很久以前在网上看到的一片文章 xff0c 忘了是谁写的了 xff0c 觉得很好 xff0c 所以在这里转载 首先要了解的是CPropertySheet实际上是由一个TabCtrl加多个Page和多个按钮组成 这里强调一点 xff0c DoM
  • win10用pip安装face_recognize

    1 安装CMake 命令 xff1a pip install CMake 2 安装face recognition xff08 也可先安装dlib xff09 命令 xff1a pip install face recognition 查看
  • VS2019配置SFML

    VS2019配置SFML 1 下载安装SFML SDK 网址 xff1a https www sfml dev org download php 解压并放在文件夹里 xff0c 记住这个路径 在我的电脑中这个路径是F C 43 43 Pro
  • django学习笔记

    未更新完成 文章目录 一 什么是django1 1 有关django1 1 1 开始1 1 2 MVC框架 设计模式1 1 3 Django架构 MTV模型 1 2 安装配置开始django1 2 1 python和django1 2 2
  • 战略性放弃日记

    文章目录 20216 26 2021 6 26 在win10中部署linux子系统ubuntu时 xff0c 安装WSL图形界面遇到报错 ccsm命令后 xff0c 报错 NoneType object has no attribute g
  • docker安装linux-ubuntu桌面环境

    操作系统 xff1a win10 docker版本 xff1a 20 10 7 xff08 可通过docker version确认 xff09 在cmd或window power shell中输入命令 1 拉取镜像 docker pull
  • Cent OS7下载和安装图形桌面教程

    具体安装教程 下载地址 xff1a https www centos org download 1 进入官网 xff0c 找到下载 xff0c 下面三个ios镜像都可以选择 2 使用链接下载cent os ios centos7安装GUI图
  • Udacity 深度学习项目2(Project2) Image Classification 解析

    本项目需要搭建一个简单的卷积神经网络 xff08 CNN xff09 来对 CIFAR 10 数据进行图片分类 本文记录了这个项目的一些注意事项 xff11 数据的预处理 xff1a 对于CIFAR 10 的图片数据 xff0c 首先要做归
  • 网络程序设计——VC的多线程编程(线程与进程)

    目录 一 线程与进程 1 线程 2 引用线程的原因 3 线程与进程的关系 4 线程的特点 二 线程函数的参数传递 三 多线程与单线程的区别 四 线程创建函数 beginthread 和 beginthreadex 五 终止线程函数 一 线程