多线程编程(3) - 多线程同步之 CriticalSection(临界区)
"临界区"(CriticalSection): 当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 让其他也要执行此代码的线程先等等; 这和前面用的 Lock 和 UnLock 差不多; 使用格式如下:
var CS: TRTLCriticalSection; {声明一个 TRTLCriticalSection 结构类型变量; 它应该是全局的} InitializeCriticalSection(CS); {初始化} EnterCriticalSection(CS); {开始: 轮到我了其他线程走开} LeaveCriticalSection(CS); {结束: 其他线程可以来了} DeleteCriticalSection(CS); {删除: 注意不能过早删除}//也可用 TryEnterCriticalSection 替代 EnterCriticalSection. var CS: TRTLCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall; var i: Integer; begin EnterCriticalSection(CS);for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));LeaveCriticalSection(CS);Result := 0; end;procedure TForm1.Button1Click(Sender: TObject); var ID: DWORD; begin CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); end;procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Align := alLeft;InitializeCriticalSection(CS); end;procedure TForm1.FormDestroy(Sender: TObject); begin DeleteCriticalSection(CS); end;
Delphi 在 SyncObjs 单元给封装了一个 TCriticalSection 类, 用法差不多
uses SyncObjs;varCS: TCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall; vari: Integer; beginCS.Enter;for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));CS.Leave;Result := 0; end;procedure TForm1.Button1Click(Sender: TObject); varID: DWORD; beginCreateThread(nil, 0, @MyThreadFun, nil, 0, ID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); end;procedure TForm1.FormCreate(Sender: TObject); beginListBox1.Align := alLeft;CS := TCriticalSection.Create; end;procedure TForm1.FormDestroy(Sender: TObject); beginCS.Free; end;
多线程编程(3) - 多线程同步之 CriticalSection(临界区)相关推荐
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...
- 多线程编程、线程同步|安全和线程通信
多线程编程 多线程的优势 线程在程序中是独立的.并发的执行流,与分隔的进程相比,进程中的线程之间的隔离程度要小.他们共享内存.文件句柄和其他每个进程应有的状态. 因为线程的划分尺度小于进程,使得多线程 ...
- java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁
在多线程编程中,要执行synchronized块,必须首先获得指定对象的锁. 1.Java的线程锁是可重入的锁 public void add(int m){ synchronized (lock){ ...
- 多线程编程 java_java多线程编程
一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般 ...
- 多线程编程java_Java多线程编程
Java给多线程编程提供了内置的支持.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销. ...
- python多线程编程_python多线程编程(1): python对多线程的支持
前面介绍过多线程的基本概念,理解了这些基本概念,掌握python多线程编程就比较容易了. 在开始之前,首先要了解一下python对多线程的支持. 虚拟机层面 Python虚拟机使用GIL(Global ...
- java多线程编程_Java多线程编程实战指南+设计模式篇.pdf
Java多线程编程实战指南+设计模式篇.pdf 对Java架构技术感兴趣的工程师朋友们可以关注我,转发此文后私信我"Java"获取更多Java编程PDF资料(附送视频精讲) 关注我 ...
- java多线程编程_Java多线程编程
本文主要对Java多线程编程进行深入研究.本文通过查看源代码及参考资料等方式研究.参考文章: Java多线程编程深入详解. 由问题入手: 问题1: 2种创建Thread的方式都是实现run()方法,但 ...
- Java多线程编程(2)--多线程编程中的挑战
一.串行.并发和并行 为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作: 第一种方式,先开始做工作A,完成之后再开始做工作B ...
最新文章
- java两个线程同时运行_java如何几乎同时结束两个线程
- Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)
- 元素的子元素_从暂元里取出子元素 | Stata编程
- Matplotlib实例教程 | 配色表 colors
- struts2配置中Action的name 和package的name和namespace作用
- Python 入门网络爬虫之精华版
- final string 堆区 栈区 java_JVM内存初学 堆、栈、方法区
- 自定义评分器Similarity,提高搜索体验(转)
- 【Spark】reduceByKey和GroupByKey
- finfoopen需要什么扩展 php_php获取文件mime类型的几种方法
- “三步走”助你完成领导者转变
- Centos7.x 装机优化
- kux格式怎么转换成mp3_优酷kux1080转码工具 1080p kux格式转换mp4|优酷kux格式转换成MP4格式...
- 安卓脚本判断运作的是不是root,su
- 面试云计算工程师岗位经常被问到的40个问题
- MAC电脑迁移本机Notes
- 禅道怎么启动mysql_禅道启动mysql报错connectByPDO
- 离散数学 极大元,极小元,最大元,最小元,上界,上确界,下界,下确界
- spm,afni的安装和使用心得
- 价值链-名词解释01
热门文章
- 热力学第二定律中的悖论 | 集智百科
- 一图读懂:中国科学院“基础研究十条”
- 40年诞生7位诺奖得主,美国贝尔实验室做对了什么?
- 制胜人工智能时代——企业人工智能应用现状分析(第三版)
- Hinton口中破解宇宙终极秘密的GPT-3厉害在哪?这有篇涂鸦详解
- 生物,AI,心理:目前的大脑/认知/意识/AGI/DRL模型
- “机器人迟钝一点,会更有人情味”,迪士尼提出新型人机交互系统
- 2018年中国人工智能100强研究报告
- 一文看懂机器视觉芯片
- 视觉系统的演化之旅——视觉器官、光感受器及视觉分子