先看看测试代码

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

相关文章:

  • 2022-01-27
  • 2022-01-11
  • 2022-02-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-06
猜你喜欢
  • 2021-11-05
  • 2021-03-28
  • 2021-10-26
  • 2022-01-20
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案