• 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

  • 相关阅读:
    机器视觉行业分析
    lua sample code analysis
    My GPU info from "GPU Caps Viewer"
    网页hack程序编写
    debug redmine send email
    如何下载web资源
    看国内网络电视解决方案2
    看国内网络电视解决方案
    babel-polyfill使用与性能优化
    升级NGINX支持HTTP/2服务端推送
  • 原文地址:https://www.cnblogs.com/feisky/p/2613921.html
Copyright © 2020-2023  润新知