一個(gè)非常簡(jiǎn)單的線程鎖顷扩,使用方便,源碼
/*
--------------使用---------------
//創(chuàng)建鎖
static XMLock lock;//保證某個(gè)作用域內(nèi)唯一
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
lock = XM_CreateLock();
});
方式一:注意別嵌套成死鎖
XM_Lock(lock);
... //中間不要有return事秀、break、continue、throw掂僵、goto...等中斷語句稿辙,否則XM_UnLock不能被執(zhí)行
XM_UnLock(lock);
方式二:注意別嵌套成死鎖
id obj;
//推薦用法
XM_OnThreadSecure(lock, [arr addObject:obj]);
XM_OnThreadSecure(lock, [arr removeObject:obj]);
//不推薦這么使用昆码,影響閱讀,可以使用方式一
XM_OnThreadSecure(
lock,
int v = arr.count;
[arr addObject:obj];
sleep(3);//這么使用可以測(cè)試鎖是否有效
);
NSLog(@"%d", v);
*/
#ifndef XMLock_h
#define XMLock_h
#include <dispatch/dispatch.h>
#define XM_CreateLock() dispatch_semaphore_create(1)
#define XM_Lock(x) dispatch_semaphore_wait(x, DISPATCH_TIME_FOREVER)
#define XM_UnLock(x) dispatch_semaphore_signal(x)
typedef dispatch_semaphore_t XMLock;
/**
簡(jiǎn)單包裹
@param lock XMLock
@param x 任意表達(dá)式邻储,表達(dá)式中不要有return赋咽、break、continue吨娜、throw脓匿、goto...等中斷語句,否則XM_UnLock不能被執(zhí)行
*/
#define XM_OnThreadSafe(lock, x) \
XM_Lock(lock); \
x; \
XM_UnLock(lock)
#endif /* XMLock_h */
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者