Linux入门-原子锁

原子操作定义:

  原子操作就是将多条指令用一条的方式执行。如在这一篇博客中所提到的案例《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和代码实现:

<未完待续>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值