0

という事は承知しています

 @synchronized(self) { /* lock is effective inside here only */ } 

複数のスレッドがメソッドに同時にアクセスするのを防ぐことができます。したがって、@synchronized{} が使用されている間は、その内部にアクセスすることはできません。

制限された数のスレッドのみを許可することをどうにかして、たとえば、2 つのスレッドまたは 3 つのスレッドのみが同時にメソッドにアクセスできるようにします。

PS: 同期リクエストを送信するメソッドがあり、同期リクエストの送信を一度に最大 3 つに制限したい

   @synchronized(self) { 
  webData  = [NSURLConnection sendSynchronousRequest: request returningResponse: &response  error: &error]; 
   }
4

2 に答える 2

2

(Bob Kinney が示唆するように)を使用するのNSOperationQueueは良い考えです。何らかの理由でそれが気に入らない場合は、GCD セマフォを使用できます。

例えば

@implementation MyObject {
    dispatch_semaphore_t semaphore_;
}

- (id)init {
    if ((self = [super init])) {
        semaphore_ = dispatch_semaphore_create(3);
    }
}

- (void)dealloc {
    dispatch_release(semaphore_);
}

- (void)doTheThing {
    dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER); {
        // Do expensive operation here.  At most 3 threads can do it at once.
    } dispatch_semaphore_signal(semaphore_);
}

詳細については、同時実行プログラミング ガイドの「ディスパッチ セマフォを使用して有限リソースの使用を規制する」を参照してください。

于 2012-10-18T04:16:10.147 に答える
1

ユースケースを説明しようとした方が良いかもしれません。実行中のプロセスの数を制限することが目標である場合は、調査することをお勧めしますNSOperationNSOperationQueueこれにより、その機能が提供されます。

同時実行プログラミング ガイド

NSOperationQueue

于 2012-10-18T03:59:17.110 に答える