继 多线程并发方案(自旋锁)之后。
原子操作:单条CPU指令
三条指令变为一条。
工程实践中用到的原子操作:
- CAS --> Compare And Swap (对比然后赋值)
原理:
1. if(a == b){ 2. 3. a = c; 4. 5. }
单例模式,赋值的时候先判断,判断a的值有没有被改变,在进行赋值。
原子操作:
代码:
#include <stdio.h> #include <pthread.h> #define THREAD_COUNT 10 pthread_mutex_t mutex; pthread_spinlock_t spinlock; int inc(int *value, int add) { //参数1.传入值得地址 参数2.增加的步长 int old; __asm__ volatile( "lock; xaddl %2, %1;" //将第二个参数的值加上第一个参数的值,赋给第一个参数 : "=a" (old) //"=a"说的寄存器 : "m" (*value), "a"(add) //"m"说的是内存 : "cc", "memory" ); void *thread_callback(void *arg) { int *pcount = (int *)arg; int i = 0; while (i ++ < 100000) { #if 0 (*pcount) ++; // #elif 0 pthread_mutex_lock(&mutex); (*pcount) ++; // pthread_mutex_unlock(&mutex); #elif 0 pthread_spin_lock(&spinlock); (*pcount) ++; // pthread_spin_unlock(&spinlock); #else inc(pcount, 1); #endif usleep(1); } } int main () { pthread_t threadid[THREAD_COUNT] = {0}; pthread_mutex_init(&mutex, NULL); pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED); int i = 0; int count = 0; for (i = 0;i < THREAD_COUNT;i ++) { pthread_create(&threadid[i], NULL, thread_callback, &count); } for (i = 0;i < 100;i ++) { printf("count : %d\n", count); sleep(1); } }
代码结果: