2009-05-21 27 views
0

で待機しているスレッドを終了します。は、どのように私は、いくつかのこのようなコードを持って@synchronized客観C

私の問題は、データベースのフェッチが必要な操作(次のビューにナビゲート)があることです。私の問題は、それが同じ同期ブロックをヒットし、それがターンを待つことです!私は理想的には、この操作を待っているすべてのスレッドを殺すか、このスレッドに高い優先度を与えてすぐに実行できるようにしたいと思います。

Appleは

スレッドを終了する推奨方法は、それは通常、そのエントリ・ポイント・ルーチンを終了させることであると述べています。 Cocoa、POSIX、およびMultiprocessing Servicesはスレッドを直接殺すためのルーチンを提供しますが、このようなルーチンの使用は強くお勧めします。

私はスレッドを殺すべきではないと思っています...しかし、同期ブロックを待っている場合、どうすればそれらを正常に終了させることができますか?この動作を処理するために私自身のセマフォを書く必要がありますか?

ありがとうございます! ニック。

答えて

3

ここで最初に質問するのは、非常に多くのスレッドが入力待ちの非常に重要なセクションを必要としますか?ここでやっていることは、並列実行をシリアライズすることです。つまり、プログラムをシングルスレッド化する(遅くなります)。できるだけロックスコープを小さくし、アプリケーションレベルで競合を減らし、適切な同期ツール(待機/シグナル)あなたはスレッドを殺す必要はほとんどないことが分かります。私はそれが非常に一般的な助言だと知っていますが、それは本当にそのように考えるのに役立ちます。

+0

があることを確信している - 私は私の推測並列実行をシリアライズしています。私は実際にsqliteを打つiPhoneデータベースのアクセスレイヤーを書いています、そして、デバイスはデータベースアクセスを実行するのがかなり遅いですが、私はちょうどclevererする必要があると思います;) –

2

通常、同期ブロックで待機しているスレッドを終了することはできません。そのような振る舞いが必要な場合は、スレッドが待機して中断されるように、時間待機と信号のパラダイムを使用する必要があります。さらに、タイムド・ウェイトとシグナル・パラダイムを使用する場合、タイムアウト・ウェイトが満了するたびに、スレッドはスリープ状態に戻ることなく、終了するか、別のパスをとる機会があります(つまり、終了することを選択しなくても)。

同期化されていないロックのために設計された同期化されていないロックでは、同期化はnoopにかなり近いはずですが、ロックが競合するとすぐに、アプリケーションのパフォーマンスに非常に有害です。あなたの並列プログラムをシリアライズしています。

私はあらゆる手段でのObjective Cの専門家ではないんだけど、私は、私は完全に同意するだろうなどの障壁、条件、アトミック、などいくつかのより高度な同期パターンが

関連する問題