您的位置:首页 > 其它

gcc原子操作与spinlock简单对比

2012-09-29 10:02 316 查看
先看看测试代码

// 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: