feisky

云计算、虚拟化与Linux技术笔记
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

gcc原子操作与spinlock简单对比

Posted on 2012-07-29 12:03  feisky  阅读(1553)  评论(0编辑  收藏  举报

先看看测试代码

// 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                            
10000000
real    0m0.235s
user    0m0.040s
sys     0m0.000s

# time ./spinlock 
10000000
real    0m0.111s
user    0m0.010s
sys     0m0.010s

# time ./cas 
10000000
real    0m0.083s
user    0m0.010s
sys     0m0.000s

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

无觅相关文章插件,快速提升流量