1 Star 1 Fork 1

maoxm/iOS_App_Template

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
XMLock.h 1.96 KB
一键复制 编辑 原始数据 按行查看 历史
maoxm 提交于 6年前 . 精简代码
//
// XMLock.h
// XMLock
//
// Created by mxm on 2018/7/20.
// Copyright © 2018年 mxm. All rights reserved.
//
// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-SW1
// https://blog.csdn.net/iosswift/article/details/44597759
/*
NSCache,NSUserDefaults是线程安全的,不需要使用
NSMutableArray
NSMutableSet
NSMutableOrderedSet
NSCountedSet
NSMutableIndexSet
NSMutableDictionary
NSMapTable
NSHashTable
NSPointerArray
NSAutoreleasePool
//这个不知道是否线程安全
NSUbiquitousKeyValueStore
--------------使用---------------
//创建锁
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)
//__VA_ARGS__
#endif /* XMLock_h */
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Objective-C
1
https://gitee.com/maoxm/iOS_App_Template.git
git@gitee.com:maoxm/iOS_App_Template.git
maoxm
iOS_App_Template
iOS_App_Template
master

搜索帮助