【发布时间】:2011-05-07 09:30:27
【问题描述】:
我需要做什么:
为了避免全局变量,我有一个包含数组的 Singleton 类。这个数组将被两个不同的线程访问:
- 1) 第一个将是主线程,并且必须不时将对象添加到此 NSMutableArray。
- 2) 另一个线程正在循环(当 TRUE 时)并尝试清空数组(当它包含某些内容时)
我的想法是(以及到目前为止我所做的):
在我的单身课程中,我有我的 NSMutableArray (list) 和 NSCondition (conditionLock)。
我的主线程正在做的是:
[[sharedSingleton conditionLock] lock];
[[sharedSingleton list] addObject:obj];
[[sharedSingleton conditionLock] signal];
[[sharedSingleton conditionLock] unlock];
我想阻止对象,以便在我尝试将对象放入其中时它不会变空。 (共享内存保护)。一旦对象被放入数组中,我就会向另一个线程发出信号。如果我理解正确,这有点增加计数器,就像信号量一样,对吗?信号告诉另一个线程“有一个对象,继续”。
第二个线程在做什么:
while (YES) {
[[sharedRequest conditionLock] lock];
[[sharedRequest conditionLock] wait];
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:[[sharedRequest list] objectAtIndex:0]];
[req performSelectorOnMainThread:@selector(Launch)
withObject: nil
waitUntilDone:YES];
[[sharedRequest list] removeObjectAtIndex:0];
[[sharedRequest conditionLock] unlock];
}
所以我想我的问题是我锁定然后等待信号,但所有 Apple 示例都按此顺序排列。 当我在主线程中添加一个对象时,此代码似乎有效。但是,当我想添加多个时,它会在 Lock 周围被挡住。
编辑
我尝试了一些不同的东西,但行为不是预期的:
像这样,我解锁了 NSMutableArray 以便 mainThread 能够添加对象。
while (YES) {
[[sharedRequest conditionLock] lock];
[[sharedRequest conditionLock] wait];
GenericsObject * obj = [[sharedRequest list] objectAtIndex:0];
[[sharedRequest list] removeObjectAtIndex:0];
[[sharedRequest conditionLock] unlock];
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:obj];
[req performSelectorOnMainThread:@selector(Launch) withObject: nil waitUntilDone:YES];
}
【问题讨论】:
-
嗨,只是一个观察,有第二个线程,其唯一目的是在主线程上调用选择器并等待它完成,这有点违背了拥有第二个线程的目的。跨度>
-
你是绝对正确的。这就是我现在使用 NSOperation 的原因。我只是在主线程上运行异步 NSURLConnection 时遇到了问题。
标签: iphone multithreading singleton semaphore shared-memory