delphi多线程访问公共变量
2010-12-22 11:15
225 查看
一、用TCriticalSection类来阻塞。(ps:这里的咚咚都涉及Win32编程,我对这些不了解,先掌握如何运用吧。)这个有点类似临界区。要Uses SyncObjs单元。
1、声明一个全局的TCriticalSection类的实例。
2、建立TCriticalSection.Create,最好是在程序onCreate里面,这样才能保证对所有线程进行控制。
3、在全局变量访问前用TCriticalSection.Acquire或TCriticalSection.Enter来阻塞。
4、访问完毕,用TCriticalSection.Release或TCriticalSection.Leave来解除阻塞。
5、在恰当的位置进行TCriticalSection.Free,一般在程序的onDestroy里。
二、用TMultiReadExclusiveWriteSynchronizer类来阻塞。可以写成TMREWSync。这个类在SysUtils单元里。(ps:天哪,那么长的单词我第一次见)。TMultiReadExclusiveWriteSynchronizer和TCriticalSection不同的是,它允许多个线程同时读一个变量,只是在写一个变量时才需要事先阻塞,因为只有多个线程同时写一个变量才有可能造成冲突。
使用TMREWS的优势是它允许多线程的并发读取,同时又与CriticalSection一样允许读的时候只有一个线程访问。劣势是TMREWS用起来要费更高的代价。
1、声明一个全局的TMultiReadExclusiveWriteSynchronizer类的实例。
2、建立TMultiReadExclusiveWriteSynchronizer.Create。
3、每个线程在读一个全局变量前要先调用该类的BeginRead()来检查是否有其他线程在写这个变量。如果有,就等待,直到其他线程不再写这个变量才返回。当读好后,调用EndRead()来结束。
如果一个线程要写这个变量,必须先调用BeginWrite()来检查当前是否有其他现成在写这个变量并且所有线程是否都调用了EndRead()。只要有一个线程正在写这个变量,或者有一个线程还没有调用EndRead(),BeginWrite()将一直等待。当线程写完以后,必须及时地调用EndWrite(),一边其他线程可以读写这个全局变量。
4、在恰当的位置进行Free,一般在程序的onDestroy里。
1、声明一个全局的TCriticalSection类的实例。
2、建立TCriticalSection.Create,最好是在程序onCreate里面,这样才能保证对所有线程进行控制。
3、在全局变量访问前用TCriticalSection.Acquire或TCriticalSection.Enter来阻塞。
4、访问完毕,用TCriticalSection.Release或TCriticalSection.Leave来解除阻塞。
5、在恰当的位置进行TCriticalSection.Free,一般在程序的onDestroy里。
二、用TMultiReadExclusiveWriteSynchronizer类来阻塞。可以写成TMREWSync。这个类在SysUtils单元里。(ps:天哪,那么长的单词我第一次见)。TMultiReadExclusiveWriteSynchronizer和TCriticalSection不同的是,它允许多个线程同时读一个变量,只是在写一个变量时才需要事先阻塞,因为只有多个线程同时写一个变量才有可能造成冲突。
使用TMREWS的优势是它允许多线程的并发读取,同时又与CriticalSection一样允许读的时候只有一个线程访问。劣势是TMREWS用起来要费更高的代价。
1、声明一个全局的TMultiReadExclusiveWriteSynchronizer类的实例。
2、建立TMultiReadExclusiveWriteSynchronizer.Create。
3、每个线程在读一个全局变量前要先调用该类的BeginRead()来检查是否有其他线程在写这个变量。如果有,就等待,直到其他线程不再写这个变量才返回。当读好后,调用EndRead()来结束。
如果一个线程要写这个变量,必须先调用BeginWrite()来检查当前是否有其他现成在写这个变量并且所有线程是否都调用了EndRead()。只要有一个线程正在写这个变量,或者有一个线程还没有调用EndRead(),BeginWrite()将一直等待。当线程写完以后,必须及时地调用EndWrite(),一边其他线程可以读写这个全局变量。
4、在恰当的位置进行Free,一般在程序的onDestroy里。
相关文章推荐
- delphi多线程访问公共变量
- delphi多线程访问公共变量
- Java多线程访问成员变量与局部变量
- Java多线程核心技术(二):对象及变量的并发访问访问
- java多线程访问同一变量及简单同步问题(待后续整理)
- delphi单元的变量和函数访问权限问题(访问范围/生命周期)
- ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
- Java多线程 - 对象及变量的并发访问
- 多线程访问成员变量与局部变量
- 【转】Java 多线程(四) 多线程访问成员变量与局部变量
- 多线程编程核心技术读书笔记(二):对象及变量的并发访问(synchronized关键字)
- 2017.2.22 多线程访问成员变量造成的问题及改正
- Java 多线程(四) 多线程访问成员变量与局部变量
- Java 多线程访问成员变量与局部变量
- 多线程编程核心技术读书笔记(二):对象及变量的并发访问(volatile关键字)
- iava多线程详解(2)-成员变量与局部变量访问
- java多线程基础值对象和变量的并发访问之synchronized(二)
- 多线程访问成员变量与局部变量
- 解决多线程访问全局变量的解决方案
- windows多线程访问变量处理