gcc原子操作与spinlock简单对比

来源:互联网 发布:杨霞sunny扒皮知乎 编辑:程序博客网 时间:2024/06/06 04:23


GCC 提供的原子操作

gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。

type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type 
*ptr, type value, ...)
type __sync_fetch_and_or (type 
*ptr, type value, ...)
type __sync_fetch_and_and (type 
*ptr, type value, ...)
type __sync_fetch_and_xor (type 
*ptr, type value, ...)
type __sync_fetch_and_nand (type 
*ptr, type value, ...)


type __sync_add_and_fetch (type 
*ptr, type value, ...)
type __sync_sub_and_fetch (type 
*ptr, type value, ...)
type __sync_or_and_fetch (type 
*ptr, type value, ...)
type __sync_and_and_fetch (type 
*ptr, type value, ...)
type __sync_xor_and_fetch (type 
*ptr, type value, ...)
type __sync_nand_and_fetch (type 
*ptr, type value, ...)



先看看测试代码


// cas.c#include <stdio.h>#include <pthread.h>#include <stdlib.h>static int count = 0;void *test_func(void *arg){        int i=0;        for(i=0;i<100000;++i){                __sync_fetch_and_add(&count,1);        }        return NULL;}int main(int argc, const char *argv[]){        pthread_t id[100];        int i = 0;        for(i=0;i<100;++i){                pthread_create(&id[i],NULL,test_func,NULL);        }        for(i=0;i<100;++i){                pthread_join(id[i],NULL);        }        printf("%d\n",count);        return 0;}


// spinlock.c#include <stdio.h>#include <pthread.h>#include <stdlib.h>static int count = 0;static pthread_spinlock_t spinlock;void *test_func(void *arg){        int i=0;        for(i=0;i<100000;++i){                pthread_spin_lock (&spinlock);                count++;                pthread_spin_unlock(&spinlock);        }        return NULL;}int main(int argc, const char *argv[]){        pthread_t id[100];        int i = 0;        pthread_spin_init (&spinlock, 0);        for(i=0;i<100;++i){                pthread_create(&id[i],NULL,test_func,NULL);        }        for(i=0;i<100;++i){                pthread_join(id[i],NULL);        }        printf("%d\n",count);        return 0;}


// mutex.c #include <stdio.h>#include <pthread.h>#include <stdlib.h>static int count = 0;static pthread_mutex_t mutex;void *test_func(void *arg){        int i=0;        for(i=0;i<100000;++i){                pthread_mutex_lock (&mutex);                count++;                pthread_mutex_unlock(&mutex);        }        return NULL;}int main(int argc, const char *argv[]){        pthread_t id[100];        int i = 0;        pthread_mutex_init (&mutex,NULL);        for(i=0;i<100;++i){                pthread_create(&id[i],NULL,test_func,NULL);        }        for(i=0;i<100;++i){                pthread_join(id[i],NULL);        }        printf("%d\n",count);        return 0;}


结果:

# time ./mutex                            10000000real    0m0.235suser    0m0.040ssys     0m0.000s# time ./spinlock 10000000real    0m0.111suser    0m0.010ssys     0m0.010s# time ./cas 10000000real    0m0.083suser    0m0.010ssys     0m0.000s

更多gcc提供的原子操作参考http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html



0 0