windows多线程所涉及基本概念

YOLO:Java 多线程测试 MQ 性能步骤及代码(示例: 简单模式) YOLO:Java 多线程测试 MQ 性能步骤以及代码(示例) 原文 1.Windows下安装RabbitMQ需要以下几个步骤 (1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang.org/downloads,双击.exe文件进行安装就好,安装完成之后创建一个名为ERLANG_HOME的环境变量,其值指向erlang的安装目录,同时将%ERLANG_HOME%\bin加入到Path中,最后打开命令行,输入erl,如果出. 阅读详情

Windows多线程所涉及基本概念

关键字:多线程 线程同步 线程池 内核对象

转帖自:http://blog.youkuaiyun.com/shengao/archive/2005/07/17/427590.aspx

1 内核对象

1 .1内核对象的概念

内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征。并且只能由内核来访问。应用程序若需要访问内核对象,需要通过操作系统提供的函数来进行,不能直接访问内核对象(Windows从安全性方面来考虑的)。

内核对象通过Create*来创建,返回一个用于标识内核对象的句柄,这些句柄(而不是内核对象)可在创建进程范围内使用,不能够被传递到其他进程中被使用。

1 .2内核对象使用的计数

因为内核对象的所有者是内核,而不是进程,所以何时撤销内核对象由内核决定,而内核做这个决定的依据就是该内核对象是否仍然被使用。那么如何判断内核对象是否被使用呢?可以通过内核对象的“使用计数”属性,一旦这个值变成0了,内核就可以释放该对象了。

1 .3创建内核对象

1 .3.1进程与句柄表

每个进程在初始化的时候,将被分配一个句柄表,该句柄表中只存储内核对象的句柄,不存储用户对象的句柄。句柄表的详细结构微软没有公布,但是大致包含三个内容:内核对象句柄,内核对象地址,访问屏蔽标志。

微软为何要将内核对象的句柄设置为进程相关的呢?理由有:

l         不同的进程对内核对象的访问权限是不同的,有必要区分对待

l         如果句柄是全局的,则一个进程可以控制另外一个进程的句柄,破坏另外一个进程的句柄。

 

1 .3.2创建内核对象及操作系统内部机制

利用CreateSomeObject的函数来创建内核对象。调用该函数的时候内核就为该对象分配一个内存块,并进行初始化,然后内核再扫描该进程的句柄表,初始化一条记录并放在句柄表中。

1 .3.3进程中使用内核对象的内部机制

假设函数F使用某个内核对象,其参数为Handle1,则该函数内部需要查找该进程的句柄表,找出参数句柄对应的记录,然后才能使用该内核对象。

1 .4关闭内核对象

无论进程怎样创建内核对象,在不使用该对象的时候都应当通过Bool CloseHandle(HANDLE hobj)来向操作系统声明结束对该对象的访问。为什么叫声明呢?是因为此时也许还有其他进程对该对象的访问,操作系统可能并不立即释放该对象。操作系统需要做的是:从进程的句柄表中删除该内核对象的记录,另外再考察该内核对象的使用计数以决定是否需要释放该对象。

1 .5内核对象的共享

说到共享,与之孪生的就是共享权限。Windows内核对象的共享有三种方式:

1 .5.1继承式共享(父子进程间)

只有当进程是父子关系的时候,才能使用此种方式的共享。特别要注意的是继承的是内核对象的句柄,内核对象本身是不具备继承性。要达到这种继承的效果需要做以下几件事:

l         在进程创建内核对象的时候,需要一个安全结构sa(SECURITY_ATTRIBUTES类型,以向OS声明对象的访问方式)作为参数。继承式共享需要将结构的成员sa.bInheritHandle设置为TRUE。此时OS内部的处理式将进程的句柄表中的该对象的访问屏蔽字段设置成“可继承”。

l         在创建子进程(CreateProcess函数)时,设置创建参数bInheritHandles为TRUE。表示被创建的子进程可以继承父进程中的所有可继承内核对象。OS内部的处理是:复制父进程句柄表中的记录到子进程的句柄表中,并使用相同的句柄值;为内核对象的使用计数器加1。

特别说明:子进程能够继承的的内核对象仅局限于父进程创建它的时候所拥有的可继承内核对象。子进程诞生后,父进程再搞出什么可继承的东西,子进程是不能用的。这就需要在子进程中使用继承的内核对象的时候需要慎重,以确定内核对象是否已被继承了。

利用SetHandleinformation方法可以随时修改内核对象句柄的一些属性,目前公开的句柄属性有两种,一种是该句柄是否能被继承,另一种是该句柄是否能被关闭。

1 .5.2同名共享

同名共享,不需要共享进程之间存在父子关系。但局限于内核对象是否支持这种共享方式。创建内核对象的Create函数中是否包含pszName是该内核对象是否支持同名共享的标志。

l         方法一:当Process1通过CreateObject(…”someName”)创建了一个名字为someName的内核对象后,Process2也调用了CreateObject(…”someName”),此时内核的动作是:在全局中查询发现已经存在someName1的对象;为Process2的句柄表添加一条Ojbect的记录,使用的句柄不确定;为someName这个Object的引用计数器加1。

l         方法二:Process2使用OpenObject(…”someName”)的方式来获得对名someName的Object的句柄。用这种Open方法的时候,需要提供一个参数让OS鉴权,以判定是否能够以参数指定的方式来访问内核对象。

1 .5.3复制内核对象的句柄的方式共享

跨进程边界的内核对象共享的另外一个方法是通过DuplicateHandle来复制内核对象句柄。

如果要将ProcessS中的对象拷贝到ProcessT中则调用DuplicateHandle的进程一定要有对这两个进程的访问权,即句柄表中拥有这两个进程内核对象的句柄记录。

2 线程的一般概念

2 .1视图

l         进程只是线程的容器,从来不执行任何东西

l         线程总是在某个进程中被创建

l         线程在进程的地址空间中执行代码

l         线程们共享进程中的所有内核对象

3 线程的创建

3 .1CreateThread调用的内核行为

调用CreateThread后,OS进行如下几个动作:

l         生成一个线程内核对象

l         在进程空间内为线程分配堆栈空间

因为线程的环境同于其所在进程的环境,所以创建的线程可以访问进程中的所有资源,包括线程中所有的内核对象。

4 线程销亡

4 .1终止线程的方式:

l         线程函数返回(最好使用这个方式,可以保证:线程种创建的C++对象正常析构;OS释放线程堆栈内存;OS将线程的退出码设置为线程函数的返回值;系统将递减该线程内核对象的的使用计数器【如果此时还有其他引用……,见下面说明】。)

l         调用ExitThread(不能释放C++对象,所以最好不要使用这个方式。另外,如果非要调用也应当调用编译器推荐的,如_endThread【Windows核心编程P127】)

l         同进程内的其他线程(包括主线程)调用TerminateThread(被撤销线程得不到通知,不能释放资源,尽量避免这种方式。另外这个函数是个异步函数,返回时,线程不保证已经被撤销,如果要观察线程是否被撤销,应当使用WaitForSingleObject)

l         包含线程的进程终止(应当避免这种方式)

4 .2线程退出时OS的行为

l         线程内的所有用户对象被释放。

l         线程的退出码从STILL_ACTIVE改为传递给ExitThread或TerminateThread的代码

l         线程内核对象的状态改为“已通知”

l         如果线程为进程中的最后一个线程,则OS将进程当作已终止运行

l         线程内核对象的引用计数器减1(一旦线程终止了,其他引用改线程内核对象将不能够处理改线程的句柄,但是可以通过调用GetExitcodeThread来检查hThread代表的线程是否已经终止运行了。)

5 线程同步

5 .1线程同步的起因以及解决之道

5 .1.1共用资源型:多个线程需要访问同一个资源的时候,为了保证资源不被破坏,需要线程对资源的访问具有原子性。
5 .1.2依赖型:一个线程等待另外一个线程某件事情完成后才能执行_可以通过手动事件的方式互相通知。

5 .2线程同步种类细分

同步起因

同步种类

同步方法备注

共用资源

多个线程对共用变量做加减操作

互锁函数族之:InterlockedExchangeAdd

共用资源

多个线程对公共变量、指针做赋值操作

互锁函数族之:InterlockedExchange ,InterlockedExchangepoint

共用资源

多个线程需要根据对公共变量、指针的判断做操作选择

互锁函数族之:InterlockedCompareExchange

              InterlockedCompareExchangePointer

共用资源

复杂数据结构(非单值),不适合互锁函数族处理的

用“关键代码”的方式,关键代码中要注意1、要尽量的快速处理完,以防止其他等待线程等待太长时间 2、线程等待过程中由用户模式切换到内核模式,耗费1000个CPU周期,时间比较长。3、只能对单个进程中的线程进行同步)

InitializeCriticalSection;

EnterCriticalSection;

LeaveCriticalSection;

DeleteCriticalSection;

处理线程同步的一种方法

 

 

 

 

对线程同步做的一个抽象,线程的同步本质上都是依赖于某个其他事件的发生,用软件的方法来对所依赖的事件做一个抽象,将有助与程序编写的简捷  

CreateEvent

 

 

 

Event的重要属性有一个是“自动”or“手动”,如果是自动的,则在某个线程用Wait××成功等待到事件的“通知”状态后,则事件状态立刻变成“未通知”状态,以保证同时对资源访问的线程只有一个。  

原则上不算线程同步范畴,而属于对wait**的一种应用方式 

 

一个可以作为定时器的内核对象,

Waitable Timer

 

CreateWaitableTimer

 

 

 

SetWaitableTimer,

 

CancelWaitableTimer

 

共用资源

一组线程对一组同样性质的资源的争用,则这组资源需要有所表示,以告知线程们是否有空闲的给以为他们服务,以信号量机制实现

CreateSemaphore,ReleaseSemaphore

共用资源

一组线程对一个单一的资源的争用,需要有一种机制保证同一个事件只有一个线程能得到资源。以Mutex方式实现

CreateMutex

ReleaseMutex

与关键代码的差别在于:

1、   允许不同进程的线程之间同步

2、   内核对象,用户模式和内核模式切换的时候需要更多的CPU开销

特别说明:WaitForSingleObject/WaitForMultipleObject是抑制线程本身的一种手法,配合以共用资源对象或所依赖的其他对象“通知状态”的原子性变化,以达到线程在争用资源、互相依赖时执行的顺序化,从而达到同步的目的。

  综上:其实Windows的线程同步机制是提供了一组不同情况下的资源争用处理办法而已。与此同时推出的Wait××却可以带来很多其他好处,甚至部分缓解C++语言没有事件机制的缺憾,部分达到了JAVA,C#中事件机制的效果,为Oberserve模式的实现做了些贡献。

C#中实现多线程委托的具体指南 本文还有配套的精品资源,点击获取 简介:在C#编程中,多线程和委托是提高应用程序性能和响应性的关键概念。本文将介绍如何在Windows Forms应用中利用这些概念,以按钮点击事件为例,通过主线程和新建线程分别向listview控件添加数据。内容涵盖线程创建与管理、委托的使用、事件和异步操作,以及如何安全地从多线程中更新UI控件。 1. 多线程概念与C#实现 ... 阅读详情

相关推荐

全面掌握Windows程序设计:CHM版完整指南

本文还有配套的精品资源,点击获取 简介:《Windows程序设计中文版》是一本涵盖Windows操作系统下程序开发核心概念的专业书籍,它采用CHM格式,便于阅读和参考。书中深入讲解了Windows API调用、用户界面设计、GDI绘图、事件驱动编程、内存管理、文件I/O、多线程编程、进程间通信、异常处理和调试技巧等关键知识点。阅读此书,开发者将获得编写高效、稳定Window...

weixin_30415591的博客 520

Windows多线程编程

Windows多线程编程总结关键字:多线程 线程同步 线程池 内核对象1 内核对象1 .1内核对象的概念内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征。并且只能由内核来访问。应用程序若需要访问内核对象,需要通过操作系统提供的函数来进行,不能直接访问内核对象(Windows从安全性方面来考虑的)。内核对象通过Create*来创建,返回一个用于标识内核对象的句柄,这些

shengao的专栏 2852

C语言在Windows下的多线程编程实战指南

在现代软件开发中,单线程的应用程序已经无法满足高性能计算的需求。多线程编程允许一个程序同时执行多个任务,有效提高了CPU的利用率和程序的响应速度。C语言标准库本身并不直接支持多线程,但是通过操作系统提供的API,开发者可以创建和管理线程,实现并发执行。

weixin_42613017的博客 1298

Windows 多线程模型 摘抄自《windows内核原理与实现》

很难做到跨平台移植,以及对于多线程模型的透明。用户级线程模型的优势是线程切换效率高,因为它不涉及系统内核模式和用户模式之间的切换;另一个好处是应用程序可以采用适合自己特点的线程选择算法,可以根据应用程序的逻辑来定义线程的优先级,当线程数量很大时,这一优势尤为明显。但是,这同样会增加应用程序代码的复杂性。有一些软件包(如POSIXThreads 或Pthreads 库)可以减轻程序员的负担。

Invoker's Tower 3300

DataWorks PyODPS第三方包全攻略:从打包到加载的完整流程

本文详细介绍了在DataWorks的PyODPS节点中使用第三方Python包的完整流程,包括环境限制、打包工具pyodps-pack的使用、资源上传与加载实战,以及特殊场景处理技巧。通过本文,开发者可以掌握在MaxCompute受限环境中灵活使用自定义依赖的方法,提升数据处理效率。

dd012的博客 989

ADS Layout设计实战:从参数设置到协同仿真

本文详细介绍了ADS Layout设计的完整实战流程,从新建工程、单位设置、个性化偏好配置等基础操作入手,逐步深入到基板参数配置、端口设置与电磁仿真器选择等核心环节。重点阐述了参数化版图设计与扫描优化、以及原理图与Layout协同仿真的高级技巧,并通过一个微带线低通滤波器设计案例,完整演示了从理论到实现的闭环设计方法,帮助工程师高效、准确地完成高频电路版图设计与验证。

weixin_29268637的博客 797

Windows C++ 内核对象 与多线程 线程同步 互斥对象

1.在windows中子进程和主进程是一起走的,在没有设置的情况下。2.主进程是不会等待子进程的结束后才继续的。1.WaitForSingleObject() 函数会等待一个内核对象的变为已通知状态(结束的时候 就是已通知状态)。2.dwMilliseconds=INFINITE 就是无限期等待3.hHandle是哪个内核对象的Handle。1.用了互斥对象后 我们在子线程的代码中 加入WaitForSingleObject(hMutex, INFINITE);

qq_52528309的博客 1041

LM Studio 模型加载与转换实战指南:从GGUF格式到本地部署

本文提供了使用LM Studio加载与转换GGUF格式大语言模型的完整实战指南。详细阐述了为何GGUF格式是本地部署的最佳选择,并逐步指导用户如何将非GGUF模型(如Transformers格式)转换为GGUF格式,以及在LM Studio中进行加载、配置GPU卸载等关键优化,最终实现流畅的本地离线对话体验。

weixin_29061425的博客 919

Windows平台上多线程编程与互斥锁

Windows平台上多线程编程 多线程(multithreading)是一种并发编程的方式,它允许程序同时执行多个任务。 1.功能 并发执行:多线程技术使得一个程序能够同时运行多个任务,这些任务在逻辑上相互独立,但在执行过程中可能共享某些资源。 资源共享:在多线程程序中,多个线程可以访问共享的内存空间,这些共享资源包括变量、数据结构等。 同步与互斥:为了保证多线程程序的正确性和效率,需要实现线程之间的同步和互斥,以避免数据竞争和死锁等问题。

热土程序园,利他愉己~ 1695

TC3xx系列LMU与SPR实战:将关键算法从Flash搬移至PSPR提升5倍执行效率

在实际电机控制项目中,通过将FOC算法全部迁移到PSPR,我们不仅将执行时间从56μs降至11μs,还将最坏情况下的时间偏差控制在±0.3μs以内。实测数据:在TC397上执行Flash中的32位浮点矩阵乘法,平均每条指令需要8.7个周期,而同样的代码在PSPR中仅需1.2个周期。传统开发中,工程师往往将所有代码放在Flash中运行,这相当于让F1赛车在乡村公路上行驶。迁移后不仅平均执行时间缩短,更重要的是时间抖动从±15%降低到±2%以内,这对闭环控制系统至关重要。不是所有代码都适合迁移到PSPR。

weixin_31421613的博客 297

用Multisim和74HC系列芯片,手把手教你搭建一个能“算数”的简易CPU模型

本文详细介绍了如何使用Multisim仿真软件和74HC系列芯片搭建一个简易CPU模型,重点解析了74HC194寄存器和74HC283加法器的核心功能与连接方法。通过分步图解和实战调试,帮助读者理解CPU工作原理,掌握数字电路设计的基本技能,适合计算机组成原理初学者和电子爱好者实践学习。

weixin_26843605的博客 139

多线程编程10例

进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。

1164

移动开发(一):使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。.NET MAUI 是一款开放源代码应用,是 Xamarin.Forms 的进化版,从移动场景扩展到了桌面场景,并从头重新生成了 UI 控件,以提高性能和可扩展性。

IT技术分享社区 2708

多线程技术在VC++串口通信程序中的应用研究

 1 概述 在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程, 同时还可以建立其他的线程

jimmy54的专栏 396

Unity之如何接入NPOI 快速读取Excel

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目

TxNet 4396

【SpringBoot 3.x 第51节】带你玩转 GraalVM Native Image:启动快到飞起,内存省到心疼,你还不试试?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1304

黑马程序员_多线程的理解与使用

-----------Windows Phone 7手机开发、.Net培训、.net学习型技术博客、期待与您交流! ------------ 1、  一个进程至少包含一个线程 同一个进程中,多个线程可以“并发”执行 2、  线程是程序中的一个执行流,每个线程都有自己专有的寄存器(栈堆指针,程序计数器等),但代码去是共享的,即不同的线程可以执行相同的函数代码。 3、  多线

jsyupan的专栏 581

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Windows多线程基本概念

Windows多线程基本概念1 Windows多线程基本概念  钱锦锋  摘要:  关键字:   1. 引言  2.线程创建 2.1 CreateThread 原型:  HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,  S

jiangxinyu的专栏 1632

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Windows多线程技术研究(二):多线程基本概念

Windows多线程技术研究(二):多线程基本概念 “ Threads绝对可以缩短程序的执行时间吗? ” “应该尽量多产生threads来帮助程序工作吗?” “任何种类的程序都可以获得Multi-Thread的好处吗?” 似是而非的观念会将你的程序带往更坏的境界。                     -----《Win32多线程程序设计》  在你想用线程时,你必须清

BlueSoal的专栏 3108

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Windows下多线程编程

前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常。Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求。 进程与线程 1. 进程的概念 进程就是正在运行的程序。主要包括两部分: • 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。 • 另一个是地址空间...

qq_32619837的博客 1万+

(C/C++)线程基本概念、如何创建多线程

线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源,比如内存、地址空间、打开的文件等等。是CPU调度和分派的基本单位,是分配资源的基本单位进程:正在运行的程序是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。

qq_54169998的博客 3176

3 Windows多线程

windows线程同步的方式一共四种:互斥对象、事件对象、信号量、关键代码段。互斥对象、事件对象、信号量属于内核对象,由于利用内核对象进行线程同步,所以速度较慢。但是这也使得可以在多进程中的各个线程中进行同步。关键代码段在用户方式下,因此同步速度较快,但在使用关键代码段时,很容易进入死锁状态,这是因为等待进入关键代码段时无法设定超时值,而且只能实现在同进程中的线程同步(当一个线程尝试进入一个已被其他线程占用的关键代码段时,它将会被阻塞,直到获得访问权限为止。

qq_40489522的博客 1105

【Windows编程】Windows多线程入门

01.文章目录 文章目录01.文章目录02.浅谈多线程03.创建线程的API(单独聊)3.1线程ID04.线程相关API4.1 线程悬挂和恢复4.2 线程优先级4.3线程退出05.线程注意与拓展5.1 线程注意事项5.2 拓展——进程间通信5.2.1 全局变量方式5.2.2 消息通信方式06.互斥量6.1 创建互斥量6.1 互斥量等待指定对象6.3 释放互斥量07.多线程实例(多版本对照)7.1 多线程(不做处理)7.2 多线程(Sleep版)7.3 多线程(解决换行问题)7.4 多线程(互斥量版)7.5

Cain Xcy的博客 1240

windows多线程

 多线程概述  进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。  线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启

WINCOL的专栏 2260

Windows中多线程的基础知识1——互斥对象

本文介绍了在Windows中利用互斥对象实现线程同步的基本方法

_Santiago的博客 1424

C++11多线程第一篇:并发基本概念及实现,进程、线程基本概念

C++11多线程第一篇:并发基本概念及实现,进程、线程基本概念

森明帮大于黑虎帮的博客 2734
上一篇: 跨线程调用MFC成员函数
下一篇: HOW TO: 编写在 Windows XP 中支持快速用户切换的应用程序
hebezai
博客等级 码龄20年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值