再谈线程基类(答王立卫兄)

[随波逐流]CTF编码工具 V5.2:从Base64到Vigenere的全能解码实战指南 本文详细介绍了[随波逐流]CTF编码工具V5.2的全能解码功能,涵盖Base64变种、Vigenere爆破、凯撒密码变体等200+编码方式。通过实战案例解析,展示如何利用该工具快速识别和解码各类CTF题目中的加密内容,提升比赛效率。特别适合CTF选手和网络安全爱好者使用。 阅读详情

(王立卫兄设计的线程基类原文地址:http://blog.youkuaiyun.com/wei801004/archive/2006/05/18/744341.aspx)

在前一篇 Trackback中,针对 王兄设计的线程基类,提出了一些个人浅见,王兄后来回复道:“ 谢谢SeaWave提的意见,线程最好的终止方式是让线程执行完任务自己退出,而我们要做的就只是closehandle。还有就是static DWORD WINAPI ThreadFun(LPVOID lpParameter);这个函数可以是static,我们可以这样调用CThread::ThreadFun,声明为private和public有 区别吗?”。就此我补充如下:
首先,王兄这个线程基类的设计很不错,通过“模板方法”让线程的使用变得更容易,而且这段代码明显只是个示例,所以写得比较简单,我纯粹是在吹毛求疵了,呵呵……
  1. 为什么我希望把ThreadFun声明为private而不是public呢?
    因为这个函数永远不应该被客户程序员调用,它应该是个被隐藏的私有函数,因为它只是Windows回调的一个函数入口,而回调函数,永远不应该直接Call的。当然,你也可以说它虽然是回调函数,但如果我们直接调用它,也不会有什么问题……其实问题还是有的,首先,过多的public声明让使用你类的程序员多一份负担,他们必须搞清楚这个public函数有什么用(你既然把它公开了,肯定就有公开的理由);其次,如果别人直接调用这个函数,则调用者的线程会阻塞直到ThreadWorkItem()返回,这肯定不是我们所希望的,是吗?
  2. 为什么我说Stop()这个函数有问题呢?
    的确,线程最好的终止方式是让线程自己退出。但是,上述设计,要么是Stop这个函数名取得有问题,要么是Stop的实现有问题。任何一本经典的设计书都告诉我们,函数名要取得符合它的实际操作,既然函数名是Stop,那么做为使用这个类的其他人来说,他会先入为主地以为,调用这个函数就会终止线程,而其实它只是简单地关闭了线程句柄;从另一方面来说,如果它只做这一件事,那么我们为什么不在线程刚一建立的时候就关闭它的句柄呢?何必专门搞一个public方法来CloseHandle呢?
    此外,既然Stop这个函数关闭了句柄,该句柄就不再可用,所以就该把这个变量设为NULL,而要设为NULL,该函数就不能是const函数。
  3. 如果是我,会怎么做呢?
    显然,Stop()这个函数应该“人如其名”,但它又不能TerminateThread,更不能阻塞直到线程终止。所以,我会首先改函数名,可以叫它SetStopFlag(),它的功能只是简单地设置一个标志,而用户线程通常是一个循环,会在适当的时机判断这个标志,以决定是否应该终止了……这种做法可见于Delphi中的TThread类,它的Terminate过程就只是简单地设置Terminated标志而已;
    第二,我还会增加一个Wait函数,它可以调用WaitForSIngleObject来等待线程的终止,这个函数对于客户程序员相当有用(实际上,在我的实现里,还有个名为StopAndWait的函数,呵呵)。
Rclone替代RaiDrive?零广告免费挂载Alist WebDAV到Windows资源管理器(含自启脚本) 本文详细介绍了如何使用开源工具Rclone替代RaiDrive,实现零广告、全免费的Alist WebDAV挂载方案。通过深入解析配置参数、提供完整的自启动解决方案和解决常见问题,帮助用户在Windows资源管理器中高效管理云存储,提升使用体验。 阅读详情

相关推荐

【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析

Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的...

TomRen 4590

c++线程间通信

参考:[-ZH-]http://47.100.58.103:999/hmd.txt[-ZH-]

a15150053530的博客 40万+

GPS-SDR-SIM使用详解

GPS-SDR-SIM 是一款开源工具,能够生成 GPS 基带信号数据流,这些数据流可通过软件定义无线电(SDR)平台(如 ADALM-Pluto、bladeRF、HackRF、USRP 等)转换为射频(RF)信号。简单来说,它能模拟 GPS 卫星信号,帮助开发者或爱好者测试 GPS 接收设备的性能,而无需依赖真实的卫星信号。

qq_35621280的博客 1241

C++ 程序设计:线程基类

灵活性:可被继承的线程基类可以灵活地根据具体需求进行扩展和定制。你可以在派生类中添加额外的成员函数、成员变量,以及自定义的线程操作接口。这使得你可以更好地适应复杂的应用需求。可定制性:通过可被继承的线程基类,你可以实现自己的线程管理策略、线程间通信机制等。你可以定义自己的线程调度算法,控制线程的执行顺序和优先级等。这样可以更好地满足特定场景下的需求。可扩展性:当你的应用需要多线程之间的协作和通信时,你可以在可被继承的线程基类中定义线程间的通信机制,例如消息队列、互斥锁、条件变量等。

weixin_42549534的博客 481

224G PAM-4 通道的 PCB 和封装设计

该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。

jkh920184196的博客 842

伺服驱动器启用后对传感器线信号干扰的解决方案

在一些Arduino项目中,研究者发现,当伺服电机启动时,传感器信号会出现显著噪声。例如,在一个假肢项目中,研究者使用光电隔离器成功隔离了伺服驱动器对EMG传感器的干扰。然而,当启用伺服驱动器时,传感器线信号常常受到干扰,导致系统性能下降。传感器线信号是传感器输出的电信号,用于测量物理量,如温度、光线或位置。例如,在一些案例中,伺服驱动器的开关操作可能导致传感器信号出现尖峰或波动,特别是在模拟传感器上更为明显。描述: 使用光电隔离或其他隔离技术,分离伺服驱动器和传感器的电气路径,防止直接干扰。

有用好玩有趣的“电”知识 1466

C++ 里面的WIN32里面线程: 如何等待子线程结束,主线程再结束

#include<windows.h> #include<stdio.h> DWORD WINAPI ThreadFun( LPVOID lpThreadParameter ); int main() { printf("主线程开头!\n"); //创建线程 HANDLE hThread = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL); //无限等待,除非子线程运行结束 WaitForS.

wenluderen的专栏 880

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

WINAPI 多线程二

等待一个内核对象变为已通知状态(single 单个) DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds); hObject: 指明一个内核对象的句柄(线程句柄) dwMilliseconds:等待时间 毫秒数 备注: 1.函数需要传递一个内核(或线程)对象句柄。 2.如果该...

weixin_41794771的博客 494

从 SAP_FLP_USER 到项目落地:把 SAP S/4HANA 中的 SAP Fiori 授权体系真正讲透

SAP Fiori授权体系涉及前端访问、应用入口和后台业务对象三层权限,仅配置基础角色如SAP_FLP_USER无法满足实际业务需求。项目实践中常见用户能看到应用磁贴但无法访问数据的问题,多因授权模型设计不完整所致。SAP建议采用分层授权策略:基础层确保launchpad访问能力,业务层配置具体应用权限。管理员角色SAP_FLP_ADMIN需结合业务权限使用,测试时可临时配置S_SERVICE=*权限,但生产环境应遵循最小权限原则。完整的授权设计需参考SAP Fiori Apps Reference Lib

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 132

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

使用CreateThread函数创建线程

线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。 在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下: HANDLE CreateThread(

Valineliu 6万+

毕设助力!从0到1构建基于YOLO的家居安防异常活动监测系统,让你的毕设守护家庭安全

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护生活”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了家居安防的哪些痛点、对比了不同YOLO模型的性能差异、系统未来能怎么优化(比如对接智能门锁/报警器、实现语音交互)。未来,这个系统还能往“更智能”的方向发展:比如结合行为分析判断异常意图、开发移动端APP实现全屋设备联动、在智慧社区中实现多家庭联防……想象空间很大。

LXY_LOVE36的博客 124

王立平--ProgressDialog

在应用中经常会用到一些费时的操作,需要用户进行等待,比如加载网页内容 。 这时候就需要一个提示来告诉用户程序正在执行, 而ProgressBar、ProgressDialog等就是专门干这个的。 实例: public class MainActivity extends Activity { private Button btn; private ProgressDia

IT技术专栏 873

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

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

王立平--Handler

Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用。比如可以用handler发送一个message,然后在handler的线程中来接收、处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带;也可以将handler对象传给其他进程,以便在其他进程中通过handler给你发送

IT技术专栏 598

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

王立平-- ContentValues , HashTable , HashMap区别

ContentValues  :是一种存储机制,key-value 特点:key只能是string类型,value:只能是基本类型,不能是对象。 应用:常用语往数据库中插入数据 ContentValues values = new ContentValues();     values.put("name", "xh");     values.put("level", 5);    

IT技术专栏 2004

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

王立平-- ContentValues , HashTable , HashMap差别

ContentValues :是一种存储机制,key-value 特点:key仅仅能是string类型。value:仅仅能是基本类型,不能是对象。 应用:经常使用语往数据库中插入数据 ContentValues values = new ContentValues(); values.put("name", "xh"); values.put("lev...

weixin_30336061的博客 117

王立平--android中的anim(动画)

简单有用步骤: 1.新建anim目录。 2.在anim下新建xml文件, 3.在xml下编写自己须要动画。 简单样例: 给Imageview加入动画 public class MainActivity extends Activity { private ImageView imv;     @Override     protected void...

weixin_34235371的博客 67

Netty学习——基础篇2(NIO编程)

新的输入/输出(NIO)库是在JDK 1.4中引入的。NIO弥补了原来同步阻塞I/O的不足,它在标准java代码中提供了高速、面向块的I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO不用使用本机代码就可以利用低级优化,这是原来的I/O无法做到的。

geminigoth的博客 1351

Netty学习——基础篇2(NIO编程)备份

新的输入/输出(NIO)库是在JDK 1.4中引入的。NIO弥补了原来同步阻塞I/O的不足,它在标准java代码中提供了高速、面向块的I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO不用使用本机代码就可以利用低级优化,这是原来的I/O无法做到的。

geminigoth的博客 1966

oracle 支持64核,联想首发全球第一款64核工作站:搭AMD线程撕裂者PRO处理器

9月23日消息,联想今天首发了全球首款64核工作站联想ThinkStation P620。不仅如此,ThinkStation P620还是全球首款也是唯一一款采用AMD Threadripper PRO处理器的专业工作站。据了解,受制于技术和架构设计,工作站要实现更强的性能往往需要两颗CPU,组成双路工作站。传统单路工作站所能支持的最大核心数是18个,ThinkStation P620搭载了AMD...

weixin_39637233的博客 179

中国速度之二神山建设(2):完善的项目计划,高效能价值流 | IDCF DevOps案例研究...

内容来源:DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队(本文只展示部分PPT及研究成果,全程视频请移步文末。)本案例内容贡献者:赖泽薇、张扬、邓茜芸、韦一...

dotNET跨平台 430

function函数嵌套 matlab_异步处理:回调函数与promise

前置知识回调可以是同步也可以是异步,异步必须放在回调里执行,也就是对于一个异步任务只有回调函数里的才是异步的,比如:<ul> <li class="one">one</li> <li class="two">two</li> <li class="three">three</li> </ul&gt...

weixin_34430676的博客 715

Python http.server模块详解:快速搭建本地静态文件服务器

HTTP服务器是Web开发的基础设施,负责处理客户端请求并返回响应。其核心原理基于HTTP协议,通过监听端口、解析请求和发送响应来实现网络通信。在开发测试场景中,快速搭建一个轻量级服务器具有重要技术价值,能够简化文件共享、接口调试和本地预览等流程。Python标准库中的http.server模块正是为此而生,它提供了零配置的解决方案,通过SimpleHTTPRequestHandler实现静态文件服务,并支持自定义扩展。该模块适用于前端开发预览、局域网文件共享和API模拟等应用场景,是开发调试的得力助手。

weixin_33721427的博客 437

深度学习笔记(4)——TextCNN、BiLSTM实现情感分类(weibo100k数据集)

使用数据集:微博数据集,共有约12万条数据,标签数为2。配置环境:Rtx3060 Laptop/AutoDL。

m0_46275020的博客 4577

S5-nano快速上手:巴西葡语开源大模型4B参数竟胜70B?新手完整指南

**S5-nano** 是巴西团队 Maritaca AI 发布的开源大语言模型:约 4B 参数、原生深耕巴西葡语(PT-BR),在巴西本地评测集上以 Instruct 平均 66.51 分的成绩反超 70B 参数的 LatamGPT 70B。它内置 Think / Instruct 双模式、262,144 token 超长上下文、工具调用与结构化输出能力,并采用 Apache-2.0 许可证可免

gitblog_00712的博客 238
上一篇: 关闭线程句柄并不代表终止线程
下一篇: GNU/GPL中文版
SeaWave
博客等级 码龄27年 117粉丝 126原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值