汇编中如何实现临界区
解决方案 »
- 已经学了半月的MFC,感觉MFC和WIN32API相比并没有减少多少代码量啊?
- 非模式对话框的问题
- MFC的exe怎么像控制台程序一样从cmd中接收参数?
- 对话框中的Myedit是一个edit派生类对象,我想改变Myedit的字体大小,我的做法见代码,为什么不生效呢?
- 如何得到指向主对话框指针?在线等....
- VC 报错:fatal error C1004
- 我写的DirectShow视频捕捉程序为什么移到别人电脑上就不能运行?
- 100分求助,问两个问题,来者有分,多谢了。
- ActiveX控件如何传递Icon句柄?
- 初学者小问题?
- CWnd,创建子窗口,求教!!!
- 如何处理Dialog中的syslink
比如c代码while( cas(&a, 1, 0) != 0 ) {
__asm pause;
}这就是短等待自选锁加锁的处理。cas是原子比较交换(当a值是0时,修改为1,返回0),a是long volatile类型。 pause是短等待指令。
对了,cas也是指令级可以实现的。
所以,我说,仅使用指令,仅可以实现短等待自选锁。
而长等待的锁,都需要挂起,提到挂起,实际叫做“调度”,本身就是操作系统相关的概念。没有操作系统的进程管理服务,调度就无从谈起。
不能这么理解。调度是一种程序结构的结果。操作系统让线程B在CPU 1 上跑,而将线程B从CPU 1上取代下来,这就是调度。你用一条指令或多条指令当然是无法实现的,这取决于操作系统的软件结构。Windows临界区(CriticalSection)是由Windows编程人员实现的一个锁,它所以比其他的锁“高效”,因为它做了“内核避让”,而其他更原始的锁原语没有做内核避让。所谓挂起又执行,实际上是操作系统又重新调度了这个线程而已,没什么神秘的。关于操作系统如何判断此线程是否终止挂起,这取决于操作系统在调度算法上的实现。(PS:内核避让是可以由用户态程序实现的,因为它是非内核的。)