汇编中如何实现临界区

解决方案 »

  1.   


    比如c代码while( cas(&a, 1, 0) != 0 ) {
        __asm pause;
    }这就是短等待自选锁加锁的处理。cas是原子比较交换(当a值是0时,修改为1,返回0),a是long volatile类型。 pause是短等待指令。
      

  2.   


    对了,cas也是指令级可以实现的。
    所以,我说,仅使用指令,仅可以实现短等待自选锁。
    而长等待的锁,都需要挂起,提到挂起,实际叫做“调度”,本身就是操作系统相关的概念。没有操作系统的进程管理服务,调度就无从谈起。
      

  3.   


    不能这么理解。调度是一种程序结构的结果。操作系统让线程B在CPU 1 上跑,而将线程B从CPU 1上取代下来,这就是调度。你用一条指令或多条指令当然是无法实现的,这取决于操作系统的软件结构。Windows临界区(CriticalSection)是由Windows编程人员实现的一个锁,它所以比其他的锁“高效”,因为它做了“内核避让”,而其他更原始的锁原语没有做内核避让。所谓挂起又执行,实际上是操作系统又重新调度了这个线程而已,没什么神秘的。关于操作系统如何判断此线程是否终止挂起,这取决于操作系统在调度算法上的实现。(PS:内核避让是可以由用户态程序实现的,因为它是非内核的。)
      

  4.   

    非常感谢sinservice,虽然没有弄清楚调用是如何实现的,大概了解了原理。