玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》

栏目: IOS · 发布时间: 8年前

内容简介:玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》

文章分享至我的个人技术博客: https://cainrun.github.io/14971830645415.html

Thread Sanitizer(TSan)

Thread Sanitizer 这个怎么翻译呢...其实我想了很久, 线程洗手液 ? 线程清扫车 ? 感觉都不太对....于是乎还是不翻译了, 我们只要知道这个东西是用来解决线程问题的就哦了, 我这个是 Objective-c 版本的, 如果你们喜欢 Swift 版本的话, 可以去找找 Swift版本

使用场景

那么在什么时候会用到这个 Thread Sanitizer 呢? 其实就是在我们精心开发好一个App之后, 发现有断断续续不停的小Bug, 然后会导致 Crash 等问题, 你又没法找到的时候, 就可以用这个东西试试看啦.

那一般会在什么情况下会发生呢? 我找到了一段比较官方的文字, 大家凑合着看看吧.

通常, 这些都是多个线程同时访问内存中的同一段地址造成的。相信线程问题是许多开发人员的噩梦。它们难以跟踪,因为错误只发生在某些条件下,所以确定问题的根本原因可能是非常棘手的。通常的原因是所谓的“race condition”。

当两个线程并发访问同一个变量,并且至少有一个访问是写时,会发生数据竞争。

Thread Sanitizer(TSan)可以检查的类型错误

虽然说 Thread Sanitizer 这个 工具 很牛逼, 但也不是万能的, 它只能够检测出以下几种错误.

  • Use of uninitialized mutexes
  • Thread leaks (missing phread_johin)
  • Unsafe calls in signal handlers (ex:malloc)
  • Unlock from wrong thread
  • Data race

打开Thread Sanitizer工具

Thread Sanitizer 工具是在工程里的 Edit Scheme -> Diagnostics 打开,

并不像 Instruments 那样在 Developer Tools 里打开.

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
1

创建项目

一切所有的东西, 都要从代码入手, 这里我们也是一样, 写一个小小的 Demo 来演示演示, UI 略丑, 大家凑合着看吧....代码的话, 在工程里自行去翻查吧~

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
2

里面的布局代码也没有什么好看的, 这里直接用的是 Masonry , 感谢 Masonry 作者的无私奉献~~

运算逻辑

这里我就不写那么大的数额了, 就取十位数哦了(别说我小气),

这里的存入逻辑灰常的简单, 计算完结果之后就传入进去:

- (void)setMoneyInTheBank {

    NSString *amount = [NSString stringWithFormat:@"总额: ¥%ld", self.bankView.amount + 10];

    [self.bankView changeLabelContentWithString:amount];
}

本来接着要去写取得逻辑, 但这里想到一个情况, 快速的按存和取, 那就会发生刚刚在文章开头所说的数据竞争问题, 这里经过思考后, 发现要使用一丢丢多线程的技巧.

- (void)getMoneyOfBanek {

    dispatch_async(dispatch_queue_create("com.threadsanitizer.ThreadSanitizer", nil), ^{

        if (self.amount <= 0) {
            NSLog(@"你都没钱啦, 怎么取?");

            return;
        }

        // 这是让线程先休息一秒先~
        sleep(1);

        dispatch_async(dispatch_get_main_queue(), ^{

            NSString *amount = [NSString stringWithFormat:@"总额: ¥%ld", self.amount -= 10];

            [self.bankView changeLabelContentWithString:amount];
        });
    });
}

写完之后, 然后运行, 狂点存和取, 然后就会出现下面酱紫的画面:

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
3

是不是很容易就找出问题的所在呢?

原理的话, 大概就和你吃饭一样, 先咽下第一口再咽下第二口, 不然一起咽下, 就会呛着了.

顺便说说:

  • TSan 是一个检查 Runtime Issues 的工具 (不支持静态检查)
  • 只能运行在语言版本3编写的Swift代码上 (Objective-C也可兼容),
  • 只能在64位macOS 或 64位模拟器上运行 (所有真机设备都不可以用来调试)。

工程地址

项目地址: https://github.com/CainRun/iOS-10-Characteristic/tree/master/2.Thread%20Sanitizer

最后

码字很费脑, 看官赏点饭钱可好
玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
微信
玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
支付宝

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Message Service API Tutorial and Reference

Java Message Service API Tutorial and Reference

Hapner, Mark; Burridge, Rich; Sharma, Rahul / 2002-2 / $ 56.49

Java Message Service (JMS) represents a powerful solution for communicating between Java enterprise applications, software components, and legacy systems. In this authoritative tutorial and comprehens......一起来看看 《Java Message Service API Tutorial and Reference》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具