windows多线程应用编程注意事项
1,资源争用保护
对于文件操作、界面资源、GDI操作等一般由主线程完成的任务,要加以顺序化处理(serialization),即一个资源一次只能由一个线程访问,多个线程同时访问将导致错误。
方法一般可采用TRTLCriticalSection,程序启动时创建TRTLCriticalSection实例,退出时释放实例,使用时先调用EnterCriticalSection,再调用LeaveCriticalSection
2,线程执行的异常处理
线程中的异常可能导致线程死在内存中无法释放,积累多了会导致资源耗尽。
因此对线程中执行的操作,一般要考虑异常处理。通常是用Try...Except 对可疑操作进行包裹,避免错误逸出。
try
res := API_call(p1,p2);
except //重要:防止函数调用出错,线程死掉不能释放!!
on e:exception do
addLog(,e.Message);
end;
3,线程释放
windows程序每个进程可以创建的线程数是有限的。本人win7 64位机器,程序最多创建的线程数不超过1500个。如果程序要创建的线程数超过最大线程数,系统就会报错。

一般程序不需要在内存中创建并运行太多线程。线程不足可能是未及时释放导致。因此线程的释放十分关键。
1,线程创建时设定 FreeOnTerminate为True,则线程执行完毕后系统会自动释放线程资源。
2,保障线程及时执行完毕execute过程。特别是注意不能出错,或出错后不进行处理。
实践发现,线程的释放时机是windows决定的。当程序可用线程足够且较忙时,即使线程已经结束,系统可能也并不马上释放线程资源,而是在空闲时缓慢释放。
但如果程序占用的线程已经达到1500左右,且又要创建新的线程时,系统就会主动去释放已经结束的线程,以便为新线程提供资源。
下图是测试启动10000个线程,发现当程序进程到达1460个线程时,程序会主动释放已结束的线程,此时线程数不再上升,且程序正常运行。

4,多线程的测试
对于多线程程序一定要进行自动化测试,因为人工测试难以模拟到一些涉及多线程特性的问题。
实践发现,Jmeter是一个非常好用的多线程压力测试工具,做好测试计划可反复使用,用法也较为简单。在此推荐一下。
windows多线程应用编程注意事项的更多相关文章
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- [百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植
之前转的: 将程序移植到64位Windows 还有自己乱写的一篇: 跨平台编程注意事项(一) 之前对于x64平台的移植都是纸上谈兵,算是前期准备工作, 但起码在写代码时,已经非常注意了.所以现在移植起 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- windows多线程没那么难
windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- 多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...
- Java 多线程并发编程一览笔录
Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...
- Linux多线程服务器端编程
目录 Linux多线程服务器端编程 线程安全的对象生命期管理 对象的销毁线程比较难 线程同步精要 借shared_ptr实现写时拷贝(copy-on-write) 多线程服务器的适用场合与常用编程模型 ...
- Windows多线程多任务设计初步(转)
Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...
随机推荐
- Android Studio签名打包应用
转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50812391 可直接看看以下的Android Studio中签名应用 Android要 ...
- 消息驱动bean(MDB)实例
到眼下为止前面介绍的有关JavaEE的东西都是同步的.也就是说调用者调用某个方法.那么这种方法必须马上运行并返回运行结果. 用官方一些的语言来说就是"client通过业务接口调用一个方法,在 ...
- Windows如何安装MSMQ消息队列
1 打开控制面板,找到下图所示的服务器核心,然点击确定 2 等待安装完成
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- java7新特性之Diamond syntax
java7新特性之Diamond syntax Java 7 also introduces a change that means less typing for you when dealing ...
- (二)Java 简介
Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...
- RK3288获取摄像头的Sensor ID【原创】
平台信息:内核:linux3.0.68 系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:通过I2C总 ...
- [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程
本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- ZOJ3962 2017 E.Seven Segment Display
数码管从某个状态顺序转移N个状态 计算总共有多少个数码管被点亮 N<=10^9 观察数码管的变化规律,有明显的周期和重复,利用这个性质,计算相对于初始状态,某一位上的某个状态重复了多少次,就可以 ...
- 杂项:game_navigation
ylbtech-杂项:game_navigation 1.返回顶部 1. 2. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处: ...