1.互斥mutex:阻止其他线程的进入,其他线程会挂起
2.自旋锁:一直等,(while(1))线程不会切换,操作时间比较短,简单的适合自旋锁
3.原子操作:三条指令合在一起
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#define THREAD_NUM 10
pthread_mutex_t mutex;
pthread_spinlock_t spinlock;
int inc(int*value, int add)
{
int old;
__asm__ volatile(
"lock; xaddl %2, %1;"
:"=a"(old)
:"m" (*value), "a" (add)
:"cc", "memory"
);
return old;
}
void* thread_proc(void* arg){
int *count = (int*)arg;
int i = 0;
while(i++ < 100000){
#if 0
(*count)++;
#elif 0
pthread_mutex_lock(&mutex);
(*count)++;
pthread_mutex_unlock(&mutex);
#elif 0
pthread_spin_lock(&spinlock);
(*count)++;
pthread_spin_unlock(&spinlock);
#elif 1
inc(count,1);
#endif
usleep(1);
}
}
int main(){
int i= 0;
pthread_t thread_id[THREAD_NUM];
pthread_mutex_init(&mutex,NULL);
pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);
int count = 0;
for(i = 0; i < THREAD_NUM; i++){
pthread_create(thread_id+i,NULL,thread_proc,&count);
}
for(i = 0; i < 100; i++)
{
sleep(1);
printf("count-->%d\n",count);
}
for(i = 0; i < THREAD_NUM; i++)
{
pthread_join(thread_id[i], NULL);
}
return 0;
}