原子操作定义:
原子操作就是将多条指令用一条的方式执行。如在这一篇博客中所提到的案例《Linux入门-线程,多线程并行,互斥锁,自旋锁》, count++是c语言中一条指令,但在汇编语句中要用三条指令完成。可以通过过添加原子锁的方式来完成。
举个栗子:
1. 分析:
count++原本的三条指令见上述文章链接中的说明,经过一条指令改变,成了xaddl 1, [court]; 。这句语法的含义是变量court加上1后再赋值给court。与自旋锁相比会更好。不会占用cpu资源。因为三条指令在执行过程中无法分割,而不是通过死循环让其他线程无法访问。
2.代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define THREAD_COUNT 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_callback(void* arg){
int *pcount = (int*)arg;
int i = 0;
while (i++ <100000){
#if 0
#elif 0
pthread_mutex_lock(&mutex); //条件为0,不使用互斥锁
(*pcount)++;
pthread_mutex_unlock(&mutex);
#elif 0
pthread_spin_lock(&spinlock); //条件为0,不适用自旋锁
(*pcount)++;
pthread_spin_unlock(&spinlock);
#else
inc(pcount, 1); //调用原子锁函数
#endif
usleep(1);
}// Thread function implementation
}
int main (){
pthread_t threads[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(&threads[i], NULL, thread_callback, &count);
}
for (i=0; i<100; i++){
printf("count: %d\n", count);
sleep(1);
}
}
3.cas和代码实现:
<未完待续>