Windows Mobile アプリケーションでRadio Layer Interface (RIL) Native APIを使用しています。この API では、ほとんどの関数の戻り値/結果はすぐには返されませんが、RIL API に渡されるコールバック関数を介して渡されます。
いくつかの使用例は、XDA 開発ツールおよびGoogle Gears Geolocation APIにあります。
私の質問は、これら 2 つの例では、他の同期オブジェクトの代わりにデータを保護するためにミューテックスが使用されているということです。
さて、クリティカル セクションは、両方の例で説明されているユース ケースでうまく機能するでしょうか? コールバック関数を実際に呼び出すスレッドまたはプロセスは?
編集:
私のデータは私のコードによってプロセス内からのみアクセスされますが、どのスレッド/プロセスがRIL APIのコールバック関数を呼び出していますか? つまり、関数コールバックを RIL API に渡しましたが、そのコールバックは他のプロセスから呼び出されているのでしょうか? その場合、サンプルが Mutex を使用している別の説明が表示されます。RIL API が実際にプロセス内にスレッドを作成し、それがコールバック関数を呼び出す場合、クリティカル セクションは問題ないと思います (そしてミューテックスよりも高速です)。
更新: (1)自分のプロセス内からコードによってアクセスされ、(2)関数コールバックから変更されるデータがあります
。コールバックは RIL API によって行われます。
私の質問: RIL API でコールバック関数を呼び出しているスレッド/プロセスはどれですか?
ここまでの話:
私:こんにちは、RIL さん、私のオフィスにいくつかのデータ (別名変数) を入れてください。
RIL: わかりました。後でデータを配置し、完了したら通知します (ここではイベントを使用しました)。
私のオフィスに入るにはアクセスカードが必要です。RIL 氏が私と同じ会社の場合、RIL 氏は自分のアクセス カードを使用して私のオフィスに入ることができます (私の場合、クリティカル セクションを意味します)。彼が他社の場合は、彼のためにアクセス カード/ビジター カードを設定する必要があります (私の場合、ここにミューテックスが必要です)。
RIL 氏が独自のアクセス カードを使用している場合、私は彼のためにアクセス カード/ビジター カードを設定する必要がないことを意味し、それは私のトラブルが少ないことを意味します。(つまり、クリティカル セクションは Mutex よりも高速です)
問題は、私がこの RIL 氏に数日前に会ったばかりで、彼についてあまり知らないことです。彼が私と同じ会社の人かどうかはわかりません。nobugzが述べた1 つのオプションは、RIL 氏が私と同じ会社の出身であるかどうかに関係なく、RIL 氏のアクセス カードを設定することです。このようにして、RIL 氏は私のオフィスに確実に入ることができます。(私のデータ/変数は安全であることが保証されています)
現在、コードでミューテックスを使用しています (Mr RIL 用におそらく冗長なアクセス カードをセットアップしています)。
あはは!これを書いているときにちょうどアイデアを得ました。RIL さんがどこの会社の人か聞いてみようと思います。そうすれば、将来、彼が私と同じ会社にいることが判明した場合、私は彼のためにアクセス カードを設定する必要がありません。(つまり、コールバック関数にGetCurrentProcessId()
andGetCurrentThreadId()
を入れます)