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個問題:
-
為什么鎖的實現(xiàn)用宏來寫京腥?
答:不是因為速度快庆捺,也不是因為內(nèi)聯(lián)! 而是因為兩者成對出現(xiàn)蠕搜!否則替換和編譯期間就會出錯。
-
2收壕、為什么不提供trylock妓灌?
答:自旋鎖都在user space,再非手動切換切換線程調(diào)度的情況下不需要用戶主動重試啼器。