2

NSOperationQueueDefaultMaxConcurrentOperationCount の最大同時実行数設定を指定して作成した NSOperationQueue のバックグラウンド スレッドの数に関連する具体的な情報を探しています。

生成するスレッドの最適な数を決定するために何らかの負荷監視が採用されていると想定していましたが、この設定はドキュメントで推奨されています。私が見つけたのは、キューが約 100 のバックグラウンド スレッドを生成し、アプリ (iOS 5.1.1 を搭載した iPad 3 で実行) が SIGABRT でクラッシュすることです。これを 3 などのより許容できる数に減らしましたが、すべて正常に動作しています。

コメントや洞察をいただければ幸いです。

4

3 に答える 3

3

私の経験はあなたと同じです (ただし、100 スレッドまでではありません。実際にそれだけの数のスレッドが同時に実行されるように、いくつかのインストルメンテーションを入れてください。それほど高くなるのを見たことはありません)。同時操作の数を手動で管理しない限り、NSOperationQueue非常に多くの同時操作が生成される傾向があります。(ドキュメントからの推論ではなく、テスト可能なコードでこれに反論する人をまだ見たことがありません。) 多数の潜在的な同時操作を生成する可能性のあるものについては、 をお勧めしsetMaxConcurrentOperationsます。理想的ではありませんが、私はしばしば次のような関数を使用して支援します (もちろん、これはキュー間のバランスをとるのに役立たないため、非常に最適ではありません)。

unsigned int countOfCores() {
  unsigned int ncpu;
  size_t len = sizeof(ncpu);
  sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);

  return ncpu;
}

NSOperationQueueCPU バウンド操作の正しい負荷分散を自動的に実行する実際のコードを投稿する人を待ち望んでいます。私が話していることを示すサンプルの要点を投稿しました。を呼び出さないとsetMaxConcurrentOperations:、2 コアの iPad 3 で約 6 つの並列プロセスが生成されます。競合や共有リソースがないこの非常に単純なケースでは、約 10% ~ 15% のオーバーヘッドが追加されます。競合のあるより複雑なコード (特に操作がキャンセルされる可能性がある場合) では、速度が桁違いに遅くなる可能性があります。

于 2012-08-13T18:50:02.593 に答える
1

スレッドがビジー状態であると仮定すると、デュアルコア iPad で 1 つのプロセスで 100 のアクティブなスレッドを実行するのは無理があります。各スレッドはかなりの時間とメモリを消費します。ビジー状態のスレッドが多数あると、デュアルコアで処理が遅くなります。

何かばかげたことをしているかどうかに関係なく (すべてをスリープ状態にしたり、実行ループを追加したり、何もしないなど)、これはバグです。

于 2012-08-13T18:40:42.173 に答える
0

ドキュメントから:

操作のデフォルトの最大数は、現在のシステム条件に基づいて NSOperationQueue オブジェクトによって動的に決定されます。

iPad 3 には、強力なプロセッサと 1Gb の RAM が搭載されています。NSOperationQueue はシステムの状態に基づいてスレッドの量を計算するため、そのデバイスで利用可能な電力に基づいて多数の NSOperation を実行できると判断した可能性が非常に高くなります。クラッシュした理由は、同時に実行されているスレッドの量に関係しているのではなく、それらのスレッド内で実行されているコードに関係している可能性があります。バックトレースをチェックして、これらのスレッド間で共有されている条件またはリソースがあるかどうかを確認します。

于 2012-08-13T18:14:23.687 に答える