2009-09-01 12 views
5

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

メインスレッドは、物事をまとめるときに、子スレッドの実行ループでCFRunLoopStop()を呼び出します。この時点で、CFRunLoopRun()は子スレッドで戻り、子スレッドは終了し、メインスレッドスレッド(子スレッドが終了するのをブロックしていたスレッド)は続行できます。

これはうまくいくようですが、私の質問です。これは安全な方法ですか?特に、CFRunLoopStop()を競合状態の原因となる別のスレッドから呼び出していますか?私が知る限り、Appleのドキュメンテーションはこのテーマについては言及していません。

メインスレッドからCFRunLoopStop()を呼び出すのが解決策ではない場合、良い解決策は何ですか?私は子スレッドがCFRunLoopRunInMode()を呼び出すことができ、ブーリアンや何かをチェックするために頻繁に目を覚ますことができることを知っていますが、私はそれを避けることができる場合、子スレッドにポーリングを行わないことを望みます。

答えて

2

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

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

Run Loop Managementが言うことです。

多分CFRunLoopStopは安全です。しかし、私は「一般的に」という言葉の使用について心配しています。私のルールは:Appleが安全だと言っていないなら、あなたはそうではないと思うべきです。

安全な側でエラーを発生させるには、実行ループソースを作成し、実行ループに追加し、スレッド終了時にソースに通知することを検討します。同じドキュメントには、カスタム実行ループソースの例が含まれています。

11

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

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

関連する問題