6

私の(主にPOSIX)アプリケーションのMacビルドは、CFRunLoopRun()を呼び出してイベントループを実行する(MacOSからネットワーク構成変更イベントを取得する)子スレッドを生成します。

荷造りして立ち去るとき、メインスレッドは子スレッドの実行ループでCFRunLoopStop()を呼び出します。その時点で、CFRunLoopRun()は子スレッドに戻り、子スレッドは終了し、メインスレッド(子スレッドが終了するのを待つブロッキング)は続行できます。

これは機能しているように見えますが、私の質問は次のとおりです。これは安全で推奨される方法ですか?特に、別のスレッドからCFRunLoopStop()を呼び出すと、競合状態が発生する可能性がありますか?私が知る限り、Appleのドキュメンテーションはこの件に関して沈黙している。

メインスレッドからCFRunLoopStop()を呼び出すことが解決策ではない場合、良い解決策は何ですか?子スレッドにCFRunLoopRunInMode()を呼び出して、ブール値などをチェックするために頻繁にウェイクアップさせることができることは知っていますが、回避できる場合は、子スレッドにポーリングを行わせたくありません。

4

2 に答える 2

15

CFRunLoopStopの場合-現在の実行ループでのみ安全に呼び出すことができれば、停止する実行ループを示すパラメーターを渡す必要はありません。

パラメータの存在は、現在の実行ループ以外の実行ループを停止するためにパラメータを使用しても問題がないことを強く示しています。

于 2010-09-22T08:29:11.890 に答える
4

特に、別のスレッドからCFRunLoopStop()を呼び出していますか[安全]?

RunLoopManagementの内容は次のとおりです。

Core Foundationの関数は一般にスレッドセーフであり、任意のスレッドから呼び出すことができます。

したがって、CFRunLoopStopは安全かもしれません。しかし、私は彼らが「一般的に」という言葉を使用することを心配しています。私のルールは次のとおりです。Appleが安全だと言っていない場合は、そうではないと想定する必要があります。

安全を期すために、実行ループソースを作成し、それを実行ループに追加して、スレッドを終了するときにそのソースにシグナルを送信することを検討してください。その同じドキュメントには、カスタム実行ループソースの例が含まれています。

于 2009-09-02T01:14:23.843 に答える