2

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()を入れます)

4

4 に答える 4

2

Windows Mobile RIL は通常、device.exe (WM6.x の場合) にあります。ただし、プロセスが RIL を呼び出すと、呼び出しは RIL プロキシ経由で渡されます。

RIL プロキシはプロセスにリンクされ、プロセス内に常駐し、プロセス境界に関連するすべての問題を処理します (余談ですが、これは少なくとも、すべての RIL データ構造を 1 つにまとめる必要がある理由の一部です)。既知のサイズのメモリ ブロック)。内部的に、RIL Proxy は、コールバックが実行されるスレッドを作成します。

これは、コードで CRITICAL_SECTION オブジェクトを使用して、必要な同期/保護を提供できることを意味します。

于 2010-06-01T17:48:07.030 に答える
1

ミューテックスを使用するポイントは、どのスレッドがコールバックを行うかがわからないことです。はい、クリティカルセクションも機能します。注意してください。間違えると、ランダムで故障の診断が非常に難しくなります。

于 2010-03-20T10:49:47.923 に答える
1

クリティカル セクションミューテックスです。クリティカル セクションは、1 つの点で (少なくとも主に) 通常のミューテックスとは異なります。つまり、1 つのプロセスに固有であり、ミューテックスは複数のプロセスで使用できます。

したがって、この場合、基本的な問題はまさに何を保護しているのかということです。それがプログラム内のデータであり、別のプロセスからアクセスできない場合は、クリティカル セクションが適切に機能するはずです。ユーザーがプログラムの 2 つのインスタンスを同時に実行した場合に 2 つのプロセスで共有されるものを保護している場合は、おそらくミューテックスが必要です。

編集:RIL自体が何をするかを保護するためにクリティカルセクションを使用しなければならない限り、いいえ、それは必要ありません(または少なくとも絶対に必要ではありません)。ミューテックスを使用すると、同じ名前のミューテックスを開いて共有リソースへのアクセスを制御することにより、すべてのプロセスが協力することを期待しています。あなたはそれを当てにできないので、それが必要な場合、インターフェースは完全に壊れています.

更新: RIL で本当に珍しいことをしていない限り、プロセス内でコールバックが発生するため、クリティカルで十分です。データを変更している場合、それはデータがマップされ、そのコードに表示されることを意味します。つまり、クリティカル セクションのデータ内のデータもマップされて表示され、機能します。クリティカル セクションが機能しないのは、個別のプロセスを扱っているときです。そのため、一方のデータが他方にマッピング/表示されません。

于 2010-03-20T15:58:03.320 に答える
0

ミューテックスとクリティカルセクション(もちろん、Windows実装)のもう1つの違いは、クリティカルセクションが再入可能であるということです。つまり、同じスレッドがクリティカルセクションを解放せずに2回取得できます。

于 2010-06-01T19:42:07.337 に答える