使用Synchronize()和使用临界区,互斥对象有何区别?性能差异这么大.为何还要存在互斥同步?(100分)

  • 主题发起人 主题发起人 淡淡的笑
  • 开始时间 开始时间

淡淡的笑

Unregistered / Unconfirmed
GUEST, unregistred user!
不是指在使用方法上,而是性能及其它细节方面.(书上没有讲到这个,只讲到临界区与事件对象[互斥
对象]的最大区别是在性能上)
既然临界区比互斥对象的性能要高40倍左右,为何还要存在互斥同步?哪种情况下(必须)使用互斥同步比较好?
谢谢
 
学习学习,帮你提前
 
Synchronize()是在一个隐蔽的窗口里运行,如果在这里你的任务很繁忙,你的主窗口
会阻塞掉,我做过测试
临界区是一个进程里的所有线程同步的最好办法,他不是系统级的,只是进程级的,
也就是说他可能利用进程内的一些标志来保证该进程内的线程同步,据Richter说
是一个记数循环。
互斥则是保证多进程间的线程同步,他是利用系统内核对象来保证同步的。
由于系统内核对象可以是有名字的,因此多个进程间可以利用这个有名字的内核对象
保证系统资源的线程安全性
 
测试结果如下: (超多线程 a,b,c,d,e,f,g....)
用Synchronize() 会阻塞 线程内的过程.(多数) 如有一c线程发生异常阻塞,a,b线程与c线程同步处理完成
用临界区 会阻塞 线程外的过程.如有一c线程发生异常阻塞. 接下来的c,d,e会等待c线程处理结束.但f,g等线程仍正常
互斥同步.现象同临界区,但狠慢 -_-
信号量对象 现象同临界区, 比互斥用的waitForSingleObject快一些.
不使用同步. 如有一c线程发生异常阻塞,不会干扰到其它线程.
/// 除了张无忌的,,,还有哪位大吓发表高见 . thx
 
互斥与信号量是内核对象,比临界区慢多了,但要同步两个线程,这两个线程又
是在两个进程空间运行,你就只能使用内核对象了.
 
聽,幫你up
 
关注一下:)
 
如张大侠言:Synchronize()只是将该线程的代码放到主线程中运行,并非线程同步。
互斥量是Win32 内核对象,又操作系统负责管理,richter的书(windows核心编程)
中有详细介绍,可以处理多个进程中的线程同步。
与互斥量相比,临界区只能在同一进程内使用,但使用临界区运行速度要远快于互斥量。
然而互斥量可以使用WaitForSingleObject实现无限等待,0时间等待和任意时间等待。
而临界区只能无限期等待,不过2k增加了TryEnterCriticalSection函数实现0时间等待。

 
我在别的地方贴了一点关于线程同步的一点东东,,,你去看看,,希望对你有所帮助:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1233274
 
程序内使用临界区,程序间使用互斥量。
 
结束,,谢谢以上各位
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部