GCDマルチスレッド:セマフォと条件付きロック



Gcd Multithreading Semaphores



セマフォ

dispatch_semaphore_t

NSOperationでは、同時実行の最大数を直接設定して、同時実行の数を制御できます。 GCDでは、同時並行性の数はセマフォによって制御されます。



セマフォは整数値であり、初期カウント値があり、シグナリングと待機の2つの操作をサポートします。セマフォが通知されると、そのカウントが増加します。スレッドがセマフォを待機すると、カウンターがゼロより大きくなるまでスレッドがブロックされ(必要な場合)、その後、スレッドはカウントを減らします。

There are three functions in GCD that are semaphore operations, namely: Dispatch_semaphore_create creates a semaphore Dispatch_semaphore_signal sends a signal Dispatch_semaphore_wait wait signal

これらの3つの関数を簡単に紹介します。最初の関数には整数パラメーターがあり、シグナルの合計量を理解できます。dispatch_semaphore_signalはシグナルを送信します。当然、シグナルの合計量は増加します。dispatch_semaphore_waitは、シグナルが発生したときにシグナルを待ちます。 total量が0未満の場合、正常に実行できるようになるまで待機し、信号の合計量を-1にします。この原則に従って、タスクと制限されたリソースアクセス制御を同期するための同時実行制御をすばやく作成できます。



/ / semaphore: integer value, up to 10 threads concurrent dispatch_semaphore_t semaphore = dispatch_semaphore_create(10) for (int i = 0 i <100 i++){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //current semaphore-1 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) NSLog(@'%d',i+1) //Thread sleep //C //sleep(1) //OC [NSThread sleepForTimeInterval:1] //current semaphore +1 dispatch_semaphore_signal(semaphore) }) }

スレッドのブロック:

/** blocking thread */ // Create a semaphore with a value of 0 dispatch_semaphore_t sema = dispatch_semaphore_create(0) // signal after the end of an operation, which will cause the semaphore to +1 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){ dispatch_semaphore_signal(sema) }) // At the beginning of execution, the semaphore is 0, the thread is blocked, until the above operation is completed, the semaphore is +1, and the thread is unblocked. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)

条件付きロック

条件付きロックは、スレッドの実行順序を制御します。これは、NSOperationの依存関係に相当します。

/* Common locks: root@xxxxx (object) object lock 2.NSLock Mutex 3.NSConditionLock conditional lock NSRecursiveLock recursive lock */ //conditional lock, condition is integer value NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:3] / / Do not lock outside, so the lock is the main thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Lock [lock lockWhenCondition:3] NSLog(@'111111111111') //Unlock [lock unlockWithCondition:4] }) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Lock [lock lockWhenCondition:4] NSLog(@'222222222222') //Unlock [lock unlock] })