当前位置: 首页 > wzjs >正文

网站群集约化建设网站备案归哪里管

网站群集约化建设,网站备案归哪里管,中国网络营销网站,骆诗网站建设《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用 《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用内核对象内核对象的定义内核对象归操作系统所有 基于 Windows 的线程创建进程与线程的关系Windows 中线程的创建方…

《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用

  • 《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用
    • 内核对象
      • 内核对象的定义
      • 内核对象归操作系统所有
    • 基于 Windows 的线程创建
      • 进程与线程的关系
      • Windows 中线程的创建方法
      • Windows 线程的销毁时间点
      • 编写多线程程序的环境设置
      • 创建“使用线程安全标准 C 函数”的线程
      • 句柄、内核对象和 ID 间的关系
    • 习题
      • (1)

《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用

内核对象

要想掌握 Windows 平台下的线程,应首先理解内核对象(Kernel Objects)的概念。

内核对象的定义

操作系统创建的资源有很多种,如进程、线程、文件及即将介绍的信号量、互斥量等。其中大部分都是通过程序员的请求创建的,而且请求方式各不相同。虽然存在一些差异,但它们之间也有如下共同点:都是由 Windows 操作系统创建并管理的资源。

不同资源类型在管理方式也有差异。例如,文件管理中应注册并更新文件相关的数据I/O位置、文件的打开模式(rcad or write)等。如果是线程,则应注册并维护线程ID、线程所属进程等信息。操作系统为了以记录相关信息的方式管理各种资源,在其内部生成数据块(结构体变量)。当然,每种资源需要维护的信息不同,所以每种资源拥有的数据块格式也有差异。这类数据块称为“内核对象”。

假设在 Windows 下创建了 mydata.txt 文件,此时 Windows 操作系统将生成 1 个数据块以便管理,该数据块就是内核对象。同理,Windows 在创建进程、线程、线程同步信号量时也会生成相应的内核对象,用于管理操作系统资源。

内核对象归操作系统所有

线程、文件等资源的创建请求均在进程内部完成,因此,很容易产生“此时创建的内核对象所有者就是进程”的错觉。其实,内核对象所有者是内核(操作系统),内核对象的创建、管理、销毁时机的决定等工作均由操作系统完成。

基于 Windows 的线程创建

进程与线程的关系

现代操作系统都支持线程,因此,非显式创建线程的程序可描述为“单一线程模型的应用程序”,显式创建单独线程的程序可描述为“多线程模型的应用程序”。这就意味着 main 函数的运行同样基于线程完成,此时进程可以比喻为装有线程的篮子,实际的运行主体是线程。

Windows 中线程的创建方法

#include <windows.h>HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId
);

参数:

  • IpThreadAttributes:线程安全相关信息,使用默认设置时传递 NULL。
  • dwStackSize:要分配给线程的栈大小,传递 0 时生成默认大小的栈。
  • IpStartAddress:传递线程的 main 函数信息。
  • lpParameter:调用 main 函数时传递的参数信息。
  • dwCreationFlags:用于指定线程创建后的行为,传递 0 时,线程创建后立即进入可执行状态。
  • IpThreadld:用于保存线程 ID 的变量地址值。

成功时返回线程句柄,失败时返回 NULL。

调用该函数将创建线程,操作系统为了管理这些资源也将同时创建内核对象。最后返回用于区分内核对象的整数型“句柄”(Handle)。

第 1 章已介绍过,句柄相当于 Linux的文件描述符。

上述定义看起来有些复杂,其实只需要考虑 IpStartAddress 和 lpParameter 这 2 个参数,剩下的只需传递 0 或 NULL 即可。

Windows 线程的销毁时间点

Windows 线程在首次调用的线程 main 函数返回时销毁(销毁时间点和销毁方法与 Linux 不同)。

还有其他方法可以终止线程,但最好的方法就是让线程main函数终止(返回)。

编写多线程程序的环境设置

旧的 VC++6.0版默认只包含支持单线程的库,需要自行配置。

在项目的属性-代码生成界面,可以检查运行库:

在这里插入图片描述

创建“使用线程安全标准 C 函数”的线程

通过 CreateThread 函数调用创建出的线程在使用 C/C++ 标准函数时并不稳定。

如果线程要调用 C/C++ 标准函数,需要通过如下方法创建线程:

#include <process.h>unitptr_t _beginthreadex(void *security,unsigned stack_size,unsigned (*start_address)(void *),void *arglist,unsigned initflag,unsigned *thrdaddr
);

上述函数与之前的 CreateThread 函数相比,参数个数及各参数的含义和顺序的相同,只是变量名和参数类型有所不同。因此,用上述函数替换 CreateThread 函数时,只需适当更改数据类型。上述函数的返回值类型 uintptr_t 是 64 位 unsigned 整数型。

程序示例:

在这里插入代码片

运行结果:

在这里插入图片描述

与 Linux 相同,Windows 同样在 main 函数返回后终止进程,也同时终止其中包含的所有线程。另外,如果对上述代码进行运行的话,最后输出的内容并非字符串"end of main",而是"running thread"。但这是在 main 函数返回后,完全销毁进程前输出的字符串。

句柄、内核对象和 ID 间的关系

线程属于操作系统管理资源,伴随内核对象的创建,为了引用内核对象而返回句柄。

可以通过句柄区分内核对象,通过内核对象可以区分线程,最终,线程句柄成为区分线程的工具。

句柄的整数值在不同进程中可能重复。通过 CreateThread/_beginthreadex 函数可以得到线程 ID,它用于区分操作系统创建的所有线程,在跨进程范围内不会重复。

习题

(1)

http://www.dtcms.com/wzjs/577025.html

相关文章:

  • 怎么建立外贸网站wordpress文件架构
  • 网站建设tlmh示范高职建设网站
  • 创意灵感网站申请自媒体账号入口
  • 视频直播网站百度账号登录
  • 网站顶部下拉广告代码盐城网站建设策划方案
  • 免费网站软件哪个好wordpress插件更新保留修改
  • 中国化学工程第六建设有限公司系统优化最好的安卓手机
  • 淘宝做个网站多少钱一家专门做原产地的网站
  • 为什么资讯网站荣誉被收录国内自适应网站案例
  • 网站 百度 关键字优化装修包工头接活网站
  • 网站设计书籍广告设计入门到精通
  • 如何看一个网站用什么程序做的微信开发者平台注销
  • seo针对网站做策划东莞关键词优化实力乐云seo
  • 做飞象金服的网站临汾网站开发
  • wordpress authentication key关键词自助优化
  • 廊坊建站软件建筑工人找活正规平台
  • 在哪个网站做流程图比较好看怎样建设一个网站教学设计
  • 建设网站利用点击量赚钱网站建设如何缴纳印花税
  • 怎么用网站模板百度爱采购推广平台
  • 网站建设教程视频教程个人免费网站注册
  • 专业的深圳网站建设公司哪家好响应式网站切图
  • 湖北省建设信息港网站wordpress登陆地址修改
  • 网站首页详细设计网站建设开票
  • 网站目录环保设备网站建设模板
  • 做运营常用的网站百度seo点击软件
  • html是建网站导航栏怎么做专门查企业的网站
  • 用jsp做学校网站久久文化传媒有限公司在哪里
  • 网站开发考什么证在百度怎么建立自己的网站
  • 网站二级域名设置如何做网站的源码
  • 雅安市建设工程招投标网站钦州公司做网站