gcc 利用原子操作實現自旋鎖

lock.h文件

typedef struct spin_lock{
    int lock;
}Lock;

#define __Lock(Lock) do{\
    if(__sync_lock_test_and_set(&(&Lock)->lock,1))\
        continue;

#define __UnLock(Lock) \
    __sync_lock_release(&(&Lock)->lock,0);\
}while(0)

//初始化鎖
static inline 
void init(Lock* L){
    L->lock = 0;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "lock.h"
#include <pthread.h>
#define MaxThread 4

static long count = 0;
Lock global_Lock;

void* work(){
    while(1){
        if(count>100)
            break;
        __Lock(global_Lock);
        printf("線程:%lu為count執(zhí)行自加操作。\n",(long)pthread_self());
        ++count;
        __UnLock(global_Lock);
    }
    pthread_exit("thread exit...\n");;
}


int main(int argc, char const *argv[])
{
    init(&global_Lock);
    pthread_t p[MaxThread];
    for(int i=0;i<MaxThread;i++){
        int status = pthread_create(&p[i],NULL,work,NULL);
        status != 0 ?exit(-1):pthread_detach(p[i]);
    }
    pthread_exit("Main thread exit...\n");
    return 0;
}

先回答2個問題:

  • 為什么鎖的實現用宏來寫?

     答:不是因為速度快,也不是因為內聯(lián)! 而是因為兩者成對出現!否則替換和編譯期間就會出錯。
    
  • 2、為什么不提供trylock?

      答:自旋鎖都在user space,再非手動切換切換線程調度的情況下不需要用戶主動重試。
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容