Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7193820
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: C/C++

2010-04-15 11:52:43

我们知道cmpxchg8b  使用规定如下:
(比较EDX:EAX与64位的目标,如果相等则ECX:EBX送往目标且ZF置1,否则目标送EDX:EAX且ZF清0。

但是当代码中编译用-fPIC 时候,则要考虑ebx寄存器冲突问题。采用ESI,先保存ebx寄存器,把esi值放到ebx,等cmpxchg8b 处理完毕后再恢复ebx。
inline bool CompareAndSwap2(  void volatile* _ptr, long _old1, long _old2, long _new1, long _new2 )
{
        bool ret = false;
        __asm__ __volatile__ ("pushl %%ebx;movl %%esi,%%ebx;lock cmpxchg8b (%1); sete %%al;popl %%ebx"
                                                    : "=a"(ret)
                                                    : "D"(_ptr), "a"(_old1), "d"(_old2), "S"(_new1), "c"(_new2)
                                                    : "memory" );
        return ret;
}
 
以上是__GNUC__方式,intel方式可响应修该。

测试代码如下
#include
struct _st
{
    int a;
    int b;
};
void main()
{
    struct _st  st;
    st.a=2;
    st.b=3;
    printf("st.a=%d;st.b=%d\n",st.a,st.b);   
    if (CompareAndSwap2(&st,2,3,4,5))
        printf("true\n");
    else
        printf("false\n");
    printf("st.a=%d; st.b=%d\n",st.a,st.b);   

阅读(2768) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-07-06 13:59:51

参考下这个列子。 注意64位环境要用cmpxchg16b #ifndef __LOCK_FREE_QUEUE_HPP__ #define __LOCK_FREE_QUEUE_HPP__ #include struct node_t; struct pointer_t { node_t *ptr; unsigned int tag; pointer_t() { ptr = NULL; tag = 0; } pointer_t(node_t *a_ptr, unsigned int a_tag) { ptr = a_ptr; tag=a_tag; } friend bool operator==(pointer_t const &l, pointer_t const &r) { return l.ptr == r.ptr && l.tag == r.tag;

chinaunix网友2010-05-30 09:49:29

lockfree的本质是乐观锁。也就是说,它假设多数情况下,别人不会改变。一个通用的lockfree算法可描述如下: lockfree_modify(DataT* data) { for (;;) { Save old state of data to a local variable; do modify; lock { if (current state == old state) commit modify & return; } } } 可以看出,lockfree也是锁,只是将锁限制在一个最小的范围内(通常是一个原子操作)。由于仍然有锁,lockfree在多核下并不会比普通的锁高明多少,它也不能随cpu个数增加而获得呈线性scale的性能提升。 不过,lockfree有个最大的好处,就是不可能有死锁。因为对上面算法分析你可以知道,在某个线程modify失败,总意味着有另一个人成功了,

chinaunix网友2010-05-05 14:48:08

#include inline bool CompareAndSwap2( void volatile* _ptr, long _old1, long _old2, long _new1, long _new2 ) { bool ret = false; __asm__ __volatile__ ("pushl %%ebx;movl %%esi,%%ebx;lock cmpxchg8b (%1); sete %%al;popl %%ebx" : "=a"(ret) : "D"(_ptr), "a"(_old1), "d"(_old2), "S"(_new1), "c"(_new2) : "memory" );