Delphi中的线程类--之(2)[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 raptor 的 blog

6、  线程b也将数据存入内存(现在内存中的数据还是4,但两个线程都对它加了一,应该是5才对,所以这里出现了错误的结果)

而用interlockincrement过程则没有这个问题,因为所谓“原语”是一种不可中断的操作,即操作系统能保证在一个“原语”执行完毕前不会进行线程切换。所以在上面那个例子中,只有当线程a执行完将数据存入内存后,线程b才可以开始从中取数并进行加一操作,这样就保证了即使是在多线程情况下,结果也一定会是正确的。

前面那个例子也说明一种“线程访问冲突”的情况,这也就是为什么线程之间需要“同步”(synchronize),关于这个,在后面说到同步时还会再详细讨论。

说到同步,有一个题外话:加拿大滑铁卢大学的教授李明曾就synchronize一词在“线程同步”中被译作“同步”提出过异议,个人认为他说的其实很有道理。在中文中“同步”的意思是“同时发生”,而“线程同步”目的就是避免这种“同时发生”的事情。而在英文中,synchronize的意思有两个:一个是传统意义上的同步(to occur at the same time),另一个是“协调一致”(to operate in unison)。在“线程同步”中的synchronize一词应该是指后面一种意思,即“保证多个线程在访问同一数据时,保持协调一致,避免出错”。不过像这样译得不准的词在it业还有很多,既然已经是约定俗成了,本文也将继续沿用,只是在这里说明一下,因为软件开发是一项细致的工作,该弄清楚的,绝不能含糊。

 

扯远了,回到tthread的构造函数上,接下来最重要就是这句了:

fhandle := beginthread(nil, 0, @threadproc, pointer(self), create_suspended, fthreadid);

本文关键:Thread Event CriticalSection Synchronize
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top