intel的lock prefix

来源:http://blog.csdn.net/overcomeunicom990702/article/details/2277647

关于同步的原语,无非就那么几种,用于进程间同步的记录锁、信号量(record lock, semaphore), 用于线程间同步的互斥量、读写锁、条件变量(mutex, rwlock, condition variable),在某些特殊的场合下,我们可以自己实现简单的用户态的锁来进行同步,这依赖于lock prefix。
根据intel 64 and IA-32 architectures software developers manual volume 2a中关于lock prefix的描述,lock prefix的作用是在执行下一条语句的时候使得处理器的LOCK#信号有效,在多处理器环境中,LOCK#有效将使得处理器独占有所有共享内存,即只有该处理器可以访问内存,其它处理器都不能对内存进行访问,当然,持续周期只有一条指令的功夫。并且,lock prefix只能用于如下指令ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG,同时还必须保证这些指令的目的操作数必须是内存,否则指令是非法的。
既然lock prefix能够起到这么一个作用并且还有这么多指令可以配合使用,因此,我们可以设计出用户态所需要的同步机制,下面给出几个简单的例子:
// 设置*bitmap的指定位为1,返回0表示成功;返回1表示该位原来就是1
static inline int set_bit(int *bitmap, uint32_t pos)
{
    asm volatile("pushf; "
                 "lock; bts %2, %0; "  // 原子操作, 将*bitmap的pos位置1
                 "jnc 1f; "            // 如果原来*bitmap的pos位为0,则跳到标号1处理
                 "mov $1, %1; "        // 原来*bitmap的pos位为1,将result置为1
                 "jmp 2f; "            // 然后返回
                 "1:"                  // 原来*bitmap的pos位为0
                 "mov $0, %1; "        // 将result置为0
                 "2: "
                 "popf; "
                 :"+m"(*bitmap), "=r"(result)
                 :"r"(bitpos)
                );
    return result;
}

// 清零bitmap的指定位为0,返回0表示成功;返回1表示该位原来就是0
static inline int clear_bit(int *bitmap, uint32_t pos)
{
    asm volatile("pushf; "
                 "lock; btr %2, %0; "  // 原子操作, 将*bitmap的pos位置为0
                 "jnc 1f; "            // 如果原来*bitmap的pos位为0,则跳到标号1处理
                 "mov $0, %1; "        // 原来*bitmap的pos位为1,将result置为0
                 "jmp 2f; "            // 然后返回
                 "1:"                  // 原来*bitmap的pos位为0
                 "mov $1, %1; "        // 将result置为1
                 "2: "
                 "popf; "
                 :"+m"(*bitmap), "=r"(result)
                 :"r"(bitpos)
                );
    return result;
}
需要注意的是,用户态的进程是可抢占的,应该避免同一事务获取两把锁的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值