我正在创建一个阻塞队列,由大约10个工作线程同时访问。基本实现队列是这样的:NSCondition:递归锁定?
-(void) enqueue:(__strong id)value
{
[_mutex lock];
while ([self size] == _maxSize) {
[_mutex wait];
}
[_queue enqueue:value];
[_mutex signal];
[_mutex unlock];
}
-(id) dequeue
{
[_mutex lock];
while ([self isEmpty]) {
[_mutex wait];
}
id value = [_queue dequeue];
[_mutex broadcast];
[_mutex unlock];
return value;
}
凡_mutex
是NSCondition
。这些问题都与-isEmpty
和-size
方法:
-(int) size
{
@try {
[_mutex lock];
return [_queue size];
}
@finally {
[_mutex unlock];
}
}
-(BOOL) isEmpty
{
@try {
[_mutex lock];
return [_queue isEmpty];
}
@finally {
[_mutex unlock];
}
}
因为他们需要互斥锁,以确保没有数据损坏的很到位,它把程序陷入僵持,为NSCondition
不递归方式锁定。但是,如果我改变我的实现以下几点:
-(void) enqueue:(__strong id)value
{
while ([self size] == _maxSize) {
[_mutex lock];
[_mutex wait];
[_mutex unlock];
}
[_mutex lock];
[_queue enqueue:value];
[_mutex signal];
[_mutex unlock];
}
-(id) dequeue
{
while ([self isEmpty]) {
[_mutex lock];
[_mutex wait];
[_mutex unlock];
}
[_mutex lock]; // when I require the lock here, another thread has already dequeued the object
id value = [_queue dequeue];
[_mutex broadcast];
[_mutex unlock];
return value;
}
然后程序不僵局,然而,我的时间重新AQUIRE锁,另一名工人已经离队,我需要已经是对象。任何想法如何使NSCondition
递归?
我没有想到这一点。感谢您在盒子外面思考! – 2012-02-03 15:54:20