iOSマルチスレッド-一般的なスレッドロック

2429 ワード

高並列のコード環境では、複数のスレッドがコードに同時にアクセスし、リソース競合が発生し、プログラムが異常になることがよくあります.スレッドロックは、これらの並列スレッドを同期的にこのコードにアクセスさせ、プログラムを正常に実行することができるという問題を解決します.次の問題を解決するには(http://www.jianshu.com/p/b3bd070cd372 )、いくつかの一般的なスレッドロックの使い方を紹介します.
- (void)testDispatchSemaphore
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    NSMutableArray *mutableArray = [NSMutableArray array];

    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            [mutableArray addObject:[NSNumber numberWithInt:i]];
        });
    }
}
一、NSLock
    NSLock *lock = [[NSLock alloc] init];
    
    for (int i = 0; i < 100000; ++i) {
        dispatch_async(queue, ^{
            //  
            [lock lock];
            //       
            [mutableArray addObject:[NSNumber numberWithInt:i]];
            //  
            [lock unlock];
        });
    }
3ステップ:
  • 初期化ロック:
  • NSLock *lock = [[NSLock alloc] init];
    
  • コードへのロック:
  •  [lock lock];
    
  • 対コードロック解除:
  • [lock unlock];
    
    二、pthread_mutex
        static pthread_mutex_t pLock;
        pthread_mutex_init(&pLock, NULL);
        
        for (int i = 0; i < 100000; ++i) {
            dispatch_async(queue, ^{
                //  
                pthread_mutex_lock(&pLock);
                //       
                [mutableArray addObject:[NSNumber numberWithInt:i]];
                //  
                pthread_mutex_unlock(&pLock);
            });
        }
    
    4ステップ:
  • 声明:
  • static pthread_mutex_t pLock;
    
    ここでは静的変数として宣言する必要があります.そうしないと、パラメータタイプが一致しません.
  • 初期化:
  • pthread_mutex_init(&pLock, NULL);
    
  • ロック
  • pthread_mutex_lock(&pLock);
    
  • アンロック
  • pthread_mutex_unlock(&pLock);
    
    三、@synchronized
        for (int i = 0; i < 100000; ++i) {
            dispatch_async(queue, ^{
                @synchronized (self) {
                    [mutableArray addObject:[NSNumber numberWithInt:i]];
                }
            });
        }
    
    最も簡単ですが、パフォーマンスが最悪です.
    四、Dispatch Semaphore
    私が書いたもう一つの文章は分析されています.詳しくはhttp://www.jianshu.com/p/b3bd070cd372
    総合的な性能と可読性、私は比較的にNSLockが好きで、性能に対する要求の高い子供靴はpthread_を使うことができますmutextとSemaphore.スピンロックOSSpinLockはアップルのエンジニアに安全ではないことが確認され、アップルはpthreadを使用している.mutextは代替され、GoogleはSemaphoreを使用しています.