修改代码, 确保 Checking 过程在多线程下的原子性 (简体中文版)

场景

// SQIHijackingDetectionNetworkPlugin.m
@interface SQIHijackingDetectionNetworkPlugin ()

@property (nonatomic, assign) BOOL isChecking;

@end

@implementation SQIHijackingDetectionNetworkPlugin

#pragma mark - SQINetworkPluginProtocol

- (void)didFailedRequest:(SQIRequest *)request response:(SQIResponse *)response {
   
    if (!self.isChecking) {
   
        self.isChecking = YES;
        // do checking…
        self.isChecking = NO;
    }
}

@end

如果 didFailedRequest 可能在任何线程被调用, 怎样确保 Checking 过程的原子性 ?


Analysis 分析

在多线程环境下,didFailedRequest: 如果在任意线程被并发调用,那么下面这段代码就会出现竞态条件(race condition):

if (!self.isChecking) {
   
    self.isChecking = YES;
    // do checking…
    self.isChecking = NO;
}

两个线程 A、B 同时执行到

你可能感兴趣的:(iOS,Multithreading,SQI,iOS,Multithreading,Atomic)