• gcc原子操作与spinlock简单对比


    先看看测试代码

    // 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

  • 相关阅读:
    NameError:name ‘xrange’ is not defined
    CNN卷积核反传分析
    在定义卷积时为什么要对其中一个函数进行翻转
    Python的浮点数损失精度问题
    Python实现im2col和col2im函数
    2018.04.19
    4 Git 基础
    Clash Royale开发日志
    2018-04-12
    python urllib2
  • 原文地址:https://www.cnblogs.com/feisky/p/2613921.html
Copyright © 2020-2023  润新知