DELPHI下多线程编程的几个思维误区(QDAC)
有几个网友私下问我一些有关线程的事情。过节写个东西上来大家交流。
思维误区1,自己新建的THREAD是线程,自己的主程序不是线程. 很多人在多线程编程没有把主线程也当作线程。其实主线程也是线程。看起来是废话,这个话确实很重要,这个就意味着,在DELPHI中,不光你开的线程,还有你的主线程所有的内存分配也是串的,进锁排队的。主线程和线程的区别
A.一般来说主线程的优先级高了点。(当然你也可以自己设置)
B.主线程在WIN下是处理APPLICATION的消息。
其他基本与你自建线程无区别。
所以这一点还可以点破小白问题,比如主线程不能进锁。其实主线程也要进锁的。关键是主线程不能挂起死等。挂起死等就用户界面卡了或者假死了。所以要进代码一边等,一边切换到其他任务。
思维误区2.线程和面向对象。
C的时候写线程反而很简单。因为C不是面向对象的。 撸代码的时候非常清楚什么在线程,什么在主线程,因为撸代码思维和机器表现一致。但是DELPHI是面向对象的。经常老会问自己类似这样的问题:这个对象在主线程还是在线程。这个OO中毒太深了,这个问题我也问过。其实DELPHI也不是绝对的面向对象,只是面向对象的封装而已,其本质还是流式代码跟C没区别,也就是跟OO没有半毛关系。
那问 这个对象在线程跑还是在主线程跑? 我只能说,所有对象都在内存,至于你哪里跑要看你的线程走了多少代码。比如
TAAAA= CLASS;
Public
procedure A;
procedure B;
procedure C;
(假设Procedure A,B,C相互没有资源冲突和相互调用)
APP代码你调用了Procedure A. 建了一个线程,线程调用Procedure B, 线程结束。
主线程跑了Procedure A, 自己建的线程跑了Procedure B. 但是他们都属于类TAAAA。
所以思维要改回来,线程跟面向对象没有半毛钱关系。不要用面向对象的思维去设计你的线程。这样你就知道你的锁该放在哪里了。
思维误区3. 锁和无锁
很多编程书里把锁讲成如厕(群里我把这个比喻成偷人,因为如厕不够污,记不住,偷人够污,容易记住。)。一个人进了厕所,其他人在门外面等着。锁就是门,人就是线程。这样的设置就是竞争机制,厕所少,人多啊。假如没有竞争机制,那当然不要锁了,每人发一个厕所,人人都幸福啊。编程中,比如固定的配置数据,你跑线程的时候每个线程配一个复本。那就不要锁了。
锁是影响你的程序效率的。犹如这边要尿急了,厕所里的人还没有出来,心里OS,TMD上个厕所真麻烦。 你要降低锁在程序里的开销。无非几个有因素:
A.锁本身的开销。(好比:上厕所里面的人出来,外面的人进去本身要时间的,这个就是锁的开销–我是乱比喻了,其实不是这样的,但是本质差不多,这样讲便于理解)。所以操作系统提供很多锁的资源和方式,所谓原子锁。其实也是锁。
B,线程等太久。
犹如上厕所等太久,多费劲啊。要解决也就2个方面,
B1,里面的人蹲太长时间了,憋死了。所以你要尽量使你的LOCK里面的任务减少。防止蹲太久.
B2,等的人太多。。排队排到大街上了。所以你要规划好你的资源。让资源分片—这个做法好比设了多个厕所。解决方案还有一个就是线程池。就是减少人。这个用如厕的比喻估计更加污。还是表达出来便于理解。“犹如,设几个人把所有人的大便都拉了。”
很多事,道理真的就这么简单。设计线程模型的时候别想多了就行。难就难在设计的时候自己容易想多,想着想着就无解了,那是自己给自己的坑啊。
http://blog.qdac.cc/?p=4564
DELPHI下多线程编程的几个思维误区(QDAC)的更多相关文章
- Windows环境下多线程编程原理与应用读书笔记(1)————基本概念
自从学了操作系统知识后,我就对多线程比较感兴趣,总想让自己写一些有关多线程的程序代码,但一直以来,发现自己都没怎么好好的去全面学习这方面的知识,仅仅是完成了操作系统课程上的小程序,对多线程的理解也不是 ...
- Delphi 实现多线程编程的线程类 TThread
http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...
- delphi之多线程编程(尚未学习)
本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...
- Linux下多线程编程
一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...
- Windows下多线程编程(一)
前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. ...
- Linux下多线程编程-信号量
今天来谈谈线程的同步--信号量. 首先来看看一些概念性的东西: 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给 ...
- Linux下多线程编程遇到的一些问题
今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...
- delphi之多线程编程
本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...
- Delphi下DLL编程知识(转)
一. DLL和系统变量 在 System 单元声明的变量中,有几个对DLL编程有特殊影响.IsLibrary 可以检测代码是执行在应用程序中还是执行在DLL中,在应用程序中 IsLibrar ...
随机推荐
- JavaScript实现form表单的多文件上传
form表单的多文件上传,具体内容如下 formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单 使用<form>表单初始化FormData对象的方式 ...
- Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 在学习C语言数据类型之前,我们先来回顾一下Java中的基本数据类型和其特点 ...
- 复制相关参数学习笔记--slave上的参数
server_id server_uuid relay_log io_thread 读取过来的本地日志. relaylog文件名前缀,可以是全路径. relay_log_index relay ...
- PatentTips - OpenCL compilation
BACKGROUND The present disclosure relates generally to integrated circuits, such as field programmab ...
- Scrapy系列教程(1)------命令行工具
默认的Scrapy项目结构 在開始对命令行工具以及子命令的探索前,让我们首先了解一下Scrapy的项目的文件夹结构. 尽管能够被改动,但全部的Scrapy项目默认有类似于下边的文件结构: scrapy ...
- [React Native] Writing Platform-Specific Components for iOS and Android in React Native
Learn to write components that render differently on iOS and Android, but present the same API. Firs ...
- Android Studio上手,基于VideoView的本地文件及流媒体播放器
既然是第一个Android程序.少不了要Hello World. 1. 新建安卓project watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm0wNTE ...
- 【机器学习实战】第12章 使用 FP-growth 算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...
- 【SAE 部署 JavaWeb 项目报 404 错误】
个人学习整理,如有不足之处,请不吝不吝赐教.转载请注明:@CSU-Max 今天写了一个小的 JavaWeb 项目传到 SAE 上.訪问的时候出错. 本地測试是正常的,并且曾经做微信平台开发的时候上传的 ...
- Python正則表達式
Python正則表達式 正則表達式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本号起添加了re 模块,它提供 Perl 风格的正則表達式模式. r ...