iOSマルチスレッド-一般的なスレッドロック
2429 ワード
高並列のコード環境では、複数のスレッドがコードに同時にアクセスし、リソース競合が発生し、プログラムが異常になることがよくあります.スレッドロックは、これらの並列スレッドを同期的にこのコードにアクセスさせ、プログラムを正常に実行することができるという問題を解決します.次の問題を解決するには(http://www.jianshu.com/p/b3bd070cd372 )、いくつかの一般的なスレッドロックの使い方を紹介します.初期化ロック: コードへのロック: 対コードロック解除: 声明: 初期化: ロック アンロック
四、Dispatch Semaphore
私が書いたもう一つの文章は分析されています.詳しくはhttp://www.jianshu.com/p/b3bd070cd372
総合的な性能と可読性、私は比較的にNSLockが好きで、性能に対する要求の高い子供靴はpthread_を使うことができますmutextとSemaphore.スピンロックOSSpinLockはアップルのエンジニアに安全ではないことが確認され、アップルはpthreadを使用している.mutextは代替され、GoogleはSemaphoreを使用しています.
- (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を使用しています.