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

使用NSOperationQueue(如 Bob Kinney 建议的)是一个好主意。如果由于某种原因你不喜欢它,你可以使用 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 回答