标签:
原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7060425
在Win32平台上进行多线程编程,常会用到锁。下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用。代码已在VS2005环境下编译测试通过。
Lock.h
Lock.cpp
下边是测试代码
在线程函数StartThread中,循环100000次,对保护资源“iNum ”反复加锁,解锁。编译,运行5次,将每次打印的线程锁切换耗时时间记录下来。之后,将测试代码中的宏 #define ENABLE_MUTEX 注释掉,禁掉互斥锁,启用临界区锁,重新编译代码,运行5次。下边是分别是互斥锁和临界区锁耗时记录(不同机器上耗时会不同):
互斥锁
线程Id |
耗时 / ms |
总计 |
||||
1 |
141 |
125 |
125 |
125 |
125 |
641 |
2 |
140 |
125 |
140 |
125 |
156 |
686 |
临界区锁
线程Id |
耗时 / ms |
总计 |
||||
1 |
15 |
16 |
31 |
31 |
31 |
124 |
2 |
31 |
31 |
31 |
16 |
31 |
140 |
互斥锁总共耗时:641+686=1327 ms,而临界区锁:124+140=264 ms。显而易见,临界区锁耗时比互斥锁耗时节约了大概5倍的时间。
总结:1、在同一个进程的多线程同步锁,宜用临界区锁,它比较节约线程上下文切换带来的系统开销。但因临界区工作在用户模式下,所以不能对不同进程中的多线程进行同步。2、因互斥对象锁属于内核对象,所以在进行多线程同步时速度会比较慢,但是可以在不同进程的多个线程之间进行同步。
标签:
原文地址:http://www.cnblogs.com/gkwang/p/4482940.html