1

CコンソールプログラムをiPhoneに移植しようとしています。すべてのコードをプロジェクトにインポートしました。ユーザーがUIのボタンをクリックすると、NSOperationでmain()を呼び出します。

とにかく、このプログラムは複雑で、独自のスレッドの多くを作成します。プログラムは「exit()」も何度も呼び出します。これによりiPhoneアプリ全体がクラッシュしますが、Cプログラムが再起動した場合は、ユーザーが再起動できるようにする必要があります。

私はこれらの終了条件のクリーンアップに取り組んでおり、Cプログラムが作成する子スレッドのいくつかでpthread_exit()を使用しました。ただし、NSOperationオブジェクトから作成されたスレッドでpthread_exit()を呼び出すと、アプリのメインスレッドがSIGABRTシグナルを取得し、アプリ全体がクラッシュします。

私は状況を正しく評価していますか?私はiOSプログラミングに慣れていないので、この信号は他の場所から来ている可能性があります...そして私が正しければ、これを回避するための最良の方法は何ですか?

(ああ、このNSOperationスレッドを終了するために「return0」を使用することについて:終了したい条件はCプログラム関数の奥深くにネストされています。すでに非常に複雑なので、プログラムの構造をできるだけ変更しないようにします。 )。

助けてくれてありがとう!

4

2 に答える 2

2

NSOperationQueueGCD キューで操作を実行します。それらは pthread でジョブを実行しますが、これらのスレッドは GCD にプライベートであり、pthread API を使用してそれらを変更または終了することはできません。Compatibility with POSIX Threadsに関するドキュメントがあり、許可されている pthread 関数と許可されていない関数を明示的に示しています。

問題を解決するには、おそらく pthread コードを で実行するのではNSOperationQueueなく、そのために作成した新しい POSIX スレッドで実行する必要があります。

于 2012-08-21T20:15:34.480 に答える
1

pthread を強制終了しないでください。自然に終了させて​​ください。同様に、exit!= pthread_exit. 作成者は、呼び出し時にクリーンアップを明らかに考慮していませんでしたexit。したがって、スレッドを強制終了して致命的なエラーを飲み込んでいるだけです。

未定義の動作や、リークやデッドロックなどの厄介な問題を引き起こすことができなかったとしたら、それは奇跡です。

つまり、ライブラリが悪用されています。実行を継続する場合は、エラーを適切に処理する必要があります。多くの作業が必要になる可能性があります。

于 2012-08-21T20:34:13.480 に答える