《win32多线程程序设计》学习笔记四

Win32多线程程序设计指南与实践 本文还有配套的精品资源,点击获取 简介:Windows环境下的多线程编程技术能够有效提高CPU资源利用率,实现程序的高并发执行。本书详细介绍了多线程编程的核心概念、线程的创建与管理、同步机制、通信方式、线程优先级调整、局部存储、终止和性能优化等方面的知识。书中还探讨了调试多线程程序的技巧,并通过实例和实践指导,帮助开发者掌握在Win32平台上构建高效、稳定并发程序的能力。 ... 阅读详情

一、Critical Sections

1、win32中关于进程和线程的协调工作是由同步机制来完成的。


2、win32中最容易使用的一个同步机制是Critical Sections。

 1)、此一次只能有一个线程获准进入Critical Sections中(相对的也就是说资源收到了保护),实施的方式是在程序中加上“进入”和“离开”的Critical Sections的操作。如果有一个线程已经“进入Critical Sections中,另一个线程就绝不能进入同一个Critical Sections中。

 2)、Critical Sections并不是核心对象。


3、将一个类型为CRITICAL_SECTION的局部变量初始化,方法是调用以下函数:



3、当你用毕Critical Sections的时候,必须调用以下函数清除:



4、一旦Critical Sections被初始化,调用以下函数进入:



5、当线程准备好离开Critical Sections时,调用以下函数:



6、不要长时间锁住一份资源。如果你一直让资源被锁定,就会阻止其它线程的执行,并把整个程序带到一个完全停止的状态。


7、避免Dangling Critical Sections。



二、死锁


三、互斥器

1、Mutex和Critical section的区别

 1 )、锁住一个未被使用mutex,比锁住一个未被使用的Critical section,需要花费几乎100倍的时间。

 2)、Mutexs可以跨进程使用。Critical section只能在同一个进程使用。

 3)、等待一个mutex时,你可以指定“结束等待”的时间长度。但是Critical section不行。


2、Mutex和Critical section对象函数比较



3、为了能够跨进程使用同一个Mutex,你可以在产生mutex时指定其名称。

      注:其他进程也可能使用这个同步机制,所以mutex名称对整个系统是全局性的。


4、产生一个互斥器



 1)、如果成功,则传回一个handle,否则传回NULL。

 2)、当你不再需要一个mutex时,你可以调用Closehandle()将它关闭。


5、打开一个互斥器

 1)、可以使用OpenMutex()打开(而非产生)一个原已存在mutex


6、锁住一个互斥器

 1)、欲获得一个mutex的拥有权,请使用Win32的Wait..()函数。

 2)、一旦没有任何线程拥有mutex,这个线程便处于激发状态。反过来说,当线程拥有mutex时,它便不处于激发状态。如果有某个线程正在等待一个未被激发mutex,它便出于“阻塞”状态。

 注:“mutex激发状态”是指当没有任何线程拥有该mutex而且有一个线程正在以函数Wait...()等待该mutex,该mutex就会短暂地出现激发状态,使Wait...()得以返回。


7、释放mutex


 1)、如果成功,返回TRUE,失败,返回FALSE。


8、Mutex拥有权

 1)、Mutex的拥有权并非属于哪个产生它的线程,而是那个最后对此mutex进行Waut...()操作并且尚未进行ReleaseMutex操作的线程。一个只能有一个mutex拥有该mutex。

 2)、Mutex的被摧毁和其拥有权没有什么关系。


9、处理被舍弃的互斥器

 1)、如果线程拥有一个mutex而在结束前没有调用ReleaseMutex(),mutex不会被摧毁。取而代之的是,该mutex会被视为“未被拥有“以及“未被激发”,而下一个等待中的线程会被以WAIT_ABANDDONED_0通知。不论线程是因为ExitThread()而结束,或是因当掉而结束,这种情况都存在。



四、信号量

1、产生信号量



 1)、Semaphore的现值代表的意义是目前可用的资源数。

 2)、每当一个锁定动作成功,Semaphore的现值就会减一。你可以要求任何一个Wait...()要求锁定一个Semaphore。

     i、如果Semaphore的现值不为0,Wait...()函数会立刻返回。

 3)、一旦Semaphore的现值降到0,就表示资源已经耗尽。此时,任何线程调用Wait...()函数,必然要等待,知道某个锁定被解除位置。


2、解除锁定


 1)、ReleaseSemaphore()对于semapore所造成得现值的添加,绝对不会超过CreateSemaphore()所指定的1MaximumCount。

 2)、请记住,lpPreviousCount所传回的是一个瞬间值。不可以把1ReleaseCount加上*lpPreviousCount,就当作是semaphore的现值,因为其他线程可能已经改变了semaphore的值。

 3)、与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就得是调用wait...()的那个线程。任何线程都可以在任何时候调用ReleaseSemaphore(),解除被任何线程锁定的semapore。


3、semaphore必须要有一个初值。



五、事件

1、Event对象是一种核心对象,他的为唯一目的就是称为激发或未激发在状态。event的状态不会因为调用Wait...()而变化。可以精确的告诉一个event对象做什么事,以及何时去做。


2、为了产生一个event对象,你必须调用CreateEvent()





六、interlocked Variables

1、同步机制最简单类型是使用interlocked函数,对着标准的32位变量进行操作。这些函数并没有提供“等待”功能,它们只是保证对某个特定变量的存取操作是“一个一个按顺序来”。


2、interlocked函数共有两个

 1)、interlockedIncrement()

 2)、interlockedDecrement()

  注:这两个函数都只能和0做比较,不能和任何其他数值作比较。


3、interlockedIncrement()函数



4、interlockedExchange()可以设置一个新值并传回旧值。




七、同步机制简要

1、Critical Section

  Critical Section是来实现“排他性占有”。适用范围是单一进程的各线程之间。他是

 1)、一个局部性对象,不是一个核心对象

 2)、快速而有效率。

 3)、不能够同时有一个以上的Critical Section被等待。

 4)、无法侦测是否已被某个线程放弃。


2、Mutex

 Mutex是一个核心对象,可以在不同线程之间实现“排他性占有”,设置甚至即使那些线程分属不同进程。他是

 1)、一个核心对象。

 2)、如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。

 3)、可以使用Wait...()等待一个mutex。

 4)、可以具名,因此可以被其他进程开启。

 5)、只能被拥有它的那个线程释放。


3、Semaphore

 Semphore被用来追踪有限的资源。他是

 1)、一个核心对象。

 2)、没有拥有者。

 3)、可以具名,因此可以被其他进程开启。

 4)、可以被任何一个线程释放。


4、Event Object

 Event Object通常使用于Overlapped,或用来设计某些自定义的同步对象。他是

 1)、一个核心对象。

 2)、完全在程序控制之下。

 3)、适用于设计新的同步对象。

 4)、“要求苏醒”的请求并不会被存储起来,可能遗失掉。

 5)、可以具名,因此可以被其他进程开启。


5、interlocked Variables

 1)、如果interlocked...()函数使用所谓的spin-lock,那么它们只是一种同步机制。

 2)、除此之外,interlocked Variables主要用于引用计数:

     I、允许4字节的数值有些基本的同步操作,不需动用到Critical Section和Mutex之类。

     II、在SMP系统中亦可有效运行。

Win32 API下的多线程程序设计实战 本文还有配套的精品资源,点击获取 简介:本文深入探讨了如何使用Win32 API在Windows平台实现多线程编程,涵盖了多线程概念、线程创建、线程同步、线程通信和线程生命周期管理。实例程序通过创建多个线程来执行不同功能,如用户界面更新、计算、数据加载和定时器任务,以提升应用程序的性能和响应性。 1. 多线程概念及其重要性 多线程编程是现代操作系统中提高程序... 阅读详情

相关推荐

Win32多线程程序设计:深入理解与源码改进

在现代操作系统中,多线程编程是一种普遍的现象,它允许程序在多核心处理器上并行执行多个任务,提升应用程序的响应性和效率。Win32 API是Windows操作系统的核心应用程序接口,它提供了一系列函数和数据结构,使得开发者可以方便地在Windows平台上实现多线程程序设计。

weixin_26805451的博客 1074

win32多线程程序设计(第二章)

第二章 线程的第一次接触 1,产生一个线程 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //描述施行于这一新线程的 security 属性。NULL表示 //使用缺省值。 DWORD dwStackSize, //新线程拥

asiwxy的博客 755

Win32多线程程序设计(pdf加全书签)

C++ Win32 多线程 Win32多线程程序设计 pdf 加全书签

Win32多线程程序设计

Win32多线程程序设计”多线程多任务“是程序开发者和用户都需要的一个重要资产。从WindowsNT开始,完全支持32位程序的抢占式多任务。带领我们进入了”多线程多任务“时代。基本概念 进程(processes) 从win32角度来看,进程含有内存和资源,被进程拥有的内存理论上可达2GB,资源包括内核对象(handle,mutex…),user资源(对话框,字符串…),GDI资源(cdc和bru

老骥伏枥,志在千里 3043

Win32多线程程序设计.pdf

Win32 多线程程序设计 线程完全手册 文字版本,非扫描版本

Win32多线程程序设计(随书源码)

Win32多线程程序设计(随书源码) 更好的学习Win32多线程程序设计

Win32 多线程程序设计有关的函数说明

Win32 多线程

weixin_45144862的博客 1192

2025年人形机器人产业研究

人形机器人是一种模仿人类外形、动作和行为的机器人,旨在替代或辅助人类完成各种任务。其显著特征包括人类外形、动作模仿和智能交互能力。根据形态和功能,人形机器人可分为小型、中型、大型以及服务型、工业型、救援型和娱乐型等类别。发展历程经历了初始阶段、高度集成系统阶段和突破性进展阶段,技术不断进步。关键技术包括执行系统、控制系统和感知与交互系统,涉及机械结构、运动控制、平衡控制、任务执行控制以及感知与交互能力。主要研究方向包括外部仿人化和内部仿生,前者关注外观设计、动作控制和任务执行能力,后者致力于模拟人类核心机制

一名80后IT人的成长记录,记录自己在工作、学习中的点点滴滴,在成长的喜悦与忧心的故事里,铭记反脆弱的勇气。 1567

WIN32多线程程序设计学习笔记(第二章) 收藏

<br />WIN32多线程程序设计学习笔记(第二章) 收藏 <br />  <br />WIN32多线程程序设计学习笔记(第二章)<br /> <br />《WIN32多线程程序设计》这本书也看了好多遍,但总是觉得印象不深;我想是不是应该做做笔记,一来可以加深一下印象。二也在可以在用时方便查阅。J<br /> <br />首先,我觉得线程一点都不难(这样的心理暗示会使我觉得学的轻松一些);<br />why?  <br />与调用函数的过程类似;线程只不过用CreateThread的API将函数<br /

looob的专栏 535

多电平双向DC/DC直流变换器的工作原理(以三电平为例子)

多电平双向DCDC变换器的工作原理一、所用论文和参考文献1.1 主要是中文的文献二、工作原理和重要概念2.1 飞跨电容的作用2.2 三电平的工作原理1.3 多电平的优点二,一些注意点2.1 电感电流的变化2.2 多飞跨电容 多余三个电平的时候的解释(截图居多) 一、所用论文和参考文献 1.1 主要是中文的文献 用于超级电容储能系统的三电平双向直流变换器及其控制 (期刊) 多电平直流变换器及其控制...

qq_32419593的博客 2万+

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

【Win32 多线程程序设计基础第一章笔记】

在计算机技术的演进中,“线程(Thread)” 始终处于 “被重视却易被误解” 的特殊地位。正如《Win32 多线程程序设计》第一章开篇所言:“计算机工业界每有新技术问世,人们总是先担忧其重要性,直到竞争对手采用才急急赶上;最终用户觉得需要它,却未必了解它是什么。” 线程技术正是如此 —— 它并非新事物,却借着 Windows NT 与 Windows 95 的庞大装机量,首次从操作系统教科书的理论概念,普及为个人电脑程序设计的核心工具。从术语定义来看,线程是比进程(Process)更小的执行单元。

云小逸的博客 1034

PySpark 本地开发环境搭建与实践

本文详细介绍了 PySpark 本地开发环境的搭建过程,包括 JDK、Hadoop、Anaconda、PySpark 的安装以及 Pycharm 工程的创建。同时,深入讲解了代码编写、本地开发案例(如 WordCount、处理特殊分隔符、读取 hdfs 数据、获取外部变量)、Spark 程序的监控和 local 模式下结果文件数量问题等内容。通过掌握这些知识和技能,读者可以在 Windows 本地环境中高效地进行 PySpark 开发,处理大规模数据,解决实际业务中的数据分析和处理问题。

天冬忘忧的博客 3012

【Win32 多线程程序设计基础第三章笔记】

本文档基于《Win32多线程程序设计.pdf》第三章内容整理,全程围绕Win32多线程中“等待机制”展开,针对零基础读者设计——不堆砌复杂术语,而是用“朋友打印文件”“线程信号灯”等通俗比喻,结合文档中原版代码案例,拆解“为什么要高效等待”“如何等待单个线程”“如何定时触发任务”“如何等待多个对象”“GUI程序如何兼顾等待与UI响应”等核心问题,所有知识点均来自指定文档,未添加外部内容,确保内容的准确性与针对性。

云小逸的博客 897

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

《Win32多线程程序设计》读后感

吐槽一句,纯粹把csdn的博客当成笔记本了。         这个月读的书籍是《Win32多线程程序设计》,忘了在那儿看到推荐这本书的,结果去图书馆一查2002年出版的,在图书馆找到这本书时把我吓着了,封面都掉了,可以想象它的历史有多悠久。。。        只随便翻了几页就决定这个月就是它了,原因很简单,它将与多线程相关的很多概念将的很简单易懂,之前学习多线程相关的知识时很重要的一个问题就是

985

部署与可视化系统:零基础到精通:LabVIEW 调用 YOLO 动态链接库(DLL)的保姆级视觉检测系统融合实战

LabVIEW与YOLO26深度集成:工业视觉检测新范式 本文揭示了LabVIEW与最新YOLO26模型深度集成的创新方案,通过C++封装ONNX Runtime为DLL,在LabVIEW中实现端到端视觉检测。核心突破点包括: 技术选型:对比YOLOv5/YOLOv8/YOLO26性能,YOLO26在CPU推理速度提升43%,支持NMS-Free端到端推理 部署架构:提供ONNX Runtime C++ API和TensorRT两种DLL封装路径,适配不同硬件环境 工程实现:详细展示从PyTorch模型导出

ZXSXJ的博客 282

WIN32多线程程序设计学习笔记(第二章)

  WIN32多线程程序设计学习笔记(第二章) 《WIN32多线程程序设计》这本书也看了好多遍,但总是觉得印象不深;我想是不是应该做做笔记,一来可以加深一下印象。二也在可以在用时方便查阅。J 首先,我觉得线程一点都不难(这样的心理暗示会使我觉得学的轻松一些);why?  与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主

chinani的专栏 2721

有手就行的CNVD证书获取

知己知彼百战不殆。要想成功挖掘CNVD漏洞并获得证书,第一步就是深入了解CNVD的漏洞发放规则和评分标准。CNVD(国家信息安全漏洞共享平台)对漏洞的评级主要基于漏洞的危害程度、影响范围以及利用难度。此外,CNVD倾向于收录那些影响国内重要信息系统或民生领域的漏洞,因此在目标选择上可以优先考虑政府、教育、医疗、金融等行业的系统。同时,提交漏洞时需要提供详细的漏洞描述、复现步骤和修复建议,确保报告内容清晰完整,以提高审核通过率。

iSee857的博客 2442

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Win32API多线程程序设计学习笔记

http://blog.sina.com.cn/s/blog_499b249c010003nw.html    Win32API多线程程序设计学习笔记 CreateThread 函数功能:该函数创建一个在调用进程的地址空间中执行的线程。 函数原型:  HANDLE  CreateThread (  LPSECURITY_ATTRIBUTES lpThreadAttributes,

孙建军的博客 950

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入浅出Win32多线程程序设计(一)

<br />  深入浅出Win32多线程程序设计之基本概念 <br />      引言<br /><br />   从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。<br /><br />   理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控

ARM专家的专栏 477

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《Win32多线程程序设计》学习笔记---(1)

        最近开始看《Win32多线程程序设计》 ,感觉受益匪浅,写出来的目的有两个;一是想看看自己理解的程度,能否总结出作者真正想表达的内容。2是与大家共享。好了,废话就不说那么多了!文章开始讲述了操作系统的演化,作者从早期的MS-DOS1.0版本单任务系统到2.x的可以允许常驻程序(TSR),但是MS-DOS视其为自己的一部分,不是一个应用程序或是一个进程。随后提及到了拥有合作型多任

hada1234的专栏 846

深入浅出Win32多线程程序设计之线程通信

 深入浅出Win32多线程程序设计之线程通信     线程之间通信的两个基本问题是互斥和同步。  线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。   线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访

boy8239的专栏 1044

WIN32多线程程序设计学习笔记(第四章 上)

WIN32多线程程序设计学习笔记(第四章 上) 到目前为止,我已经知道如何创建线程,销毁线程及如何判断一个线程是否结束了;但运用线程,管理线程,如何使线程按自己意愿正确运行才是多线程程序设计的重点及难点。 大家知道,线程具有并发性,在同一时间段会存在多个线程,当这些线程同时存取同一数据时,就会有问题。就像在超市储物品一样,来的时候物品箱是空,转身拿物品准备储的时候,发现物品箱

chinani的专栏 2148

深入浅出Win32多线程程序设计

深入浅出Win32多线程程序设计之基本概念 2005-12-14 09:48作者:宋宝华出处:天极开发责任编辑:方舟   引言   从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。   理解多线程及其同步、互斥

amanda_123的专栏 973
上一篇: 《TCP/IP详解卷一:协议》学习笔记二
下一篇: 《win32多线程程序设计》学习笔记五
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值