GCC 提供的原子操作
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。
type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type *ptr, type value, ...)
type __sync_fetch_and_or (type *ptr, type value, ...)
type __sync_fetch_and_and (type *ptr, type value, ...)
type __sync_fetch_and_xor (type *ptr, type value, ...)
type __sync_fetch_and_nand (type *ptr, type value, ...)
type __sync_add_and_fetch (type *ptr, type value, ...)
type __sync_sub_and_fetch (type *ptr, type value, ...)
type __sync_or_and_fetch (type *ptr, type value, ...)
type __sync_and_and_fetch (type *ptr, type value, ...)
type __sync_xor_and_fetch (type *ptr, type value, ...)
type __sync_nand_and_fetch (type *ptr, type value, ...)
先看看测试代码
// 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