一个非常简单的线程锁,使用方便,源码
/*
--------------使用---------------
//创建锁
static XMLock lock;//保证某个作用域内唯一
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
lock = XM_CreateLock();
});
方式一:注意别嵌套成死锁
XM_Lock(lock);
... //中间不要有return、break、continue、throw、goto...等中断语句,否则XM_UnLock不能被执行
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);//这么使用可以测试锁是否有效
);
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;
/**
简单包裹
@param lock XMLock
@param x 任意表达式,表达式中不要有return、break、continue、throw、goto...等中断语句,否则XM_UnLock不能被执行
*/
#define XM_OnThreadSafe(lock, x) \
XM_Lock(lock); \
x; \
XM_UnLock(lock)
#endif /* XMLock_h */
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。