私は、HTTP接続からデータを受信し、そのデータが入ってくるときに1つまたは複数のスレッドによって処理されるアプリケーションで作業しています。リーダースレッドが受信データを待つことができるようにNSConditionを使用します。接続スレッドは、データが利用可能になったときにそれらをブロードキャストしますが、デッドロックが発生し続けています。理由はわかりません。私はNSConditionの仕組みを誤解しているか、私は何か他のものが欠けていることをそれほど長い間見てきました。NSConditionデッドロック
// lock = NSCondition ivar
// position = long long ivar
// writeDataToFile performs no locking but just writes the data to an NSHandle and logs in debug
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
[condition lock];
@try {
[self writeDataToFile:data];
position += [data length];
hasMoreData = YES;
} @finally {
[condition broadcast];
[condition unlock];
}
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
int statusCode = [httpResponse statusCode];
requestSuccess = (statusCode == 200);
[condition lock];
[condition broadcast];
[condition unlock];
}
- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {
[condition lock];
hasMoreData = YES;
[condition broadcast];
[condition unlock];
}
- (void)waitForData {
[condition lock];
@try {
while(!hasMoreData) {
[condition wait];
}
} @finally {
hasMoreData = NO;
[condition unlock];
}
}
さて、これは一般的に動作しますが、時折、私はアプリがハング見ると、サンプルは一つのスレッドは、ロックを取得するために待機、別のwaitForData
でロックを取得するために待機状態で待機し、他を示しています。ここでは、コードです`connection:didReceiveData 'です。
私は、[condition wait]
コールが内部ミューテックスを原子的にロック解除して条件を待つので、複数の待機中のスレッドがconnection:didReceiveData:
スレッドが条件を取得してブロードキャストするのを防ぎません。
私には何が欠けていますか?
おかげで、
J
提案していただきありがとうございますが、私はエラーメソッド(コードを含むように更新された質問)の条件を解除しています。このケースでは、スレッドが接続にハングしているので接続が失敗していないため、私はそれを含めなかった:didReceiveData:selector。 – JWood