1

私はレガシーコードを見ています。2 つの DLL が共通のコード ベースを共有していることがわかります。そのため、DLL はいくつかの共通のメソッドと同期オブジェクト名を共有しています。これは、両方が同じ名前のクリティカル セクション同期オブジェクトを作成して使用することを意味します。Windowsのプロセス内であっても、グローバル/静的変数が2つのモジュール間で共有されないことを知っています。理論的には、それぞれの DLL で独立して実行される 2 つの独立した同期オブジェクトを作成しているため、問題にはなりません。

ここで、このシナリオを考えてみましょう。前述のように、2 つの DLL A.dll と B.dll をロードするプロセス Proc.exe があります。これらの DLL はどちらも、共通のクリティカル セクション オブジェクト名 g_cs といくつかの共通のメソッド名を持ちます。次のようにスレッドセーフな一般的なメソッド名 foo() :

foo()
{
  ....
  EnterCriticalSection(g_cs)
  ....
  ....
  LeaveCriticalSection(g_cs)
  ....
  ....
}

T1 と T2 の 2 つのスレッドが Proc.exe 内で実行されており、現在 foo() メソッドにあるとします。デッドロックが発生することがあります。ログから、t1 と t2 が critical_section g_cs を次々に取得し、その後「g_cs」のロックを解除しないことがわかります。私の理解では、T1 と T2 は、それぞれ A.dll と B.dll のコンテキストで実行されている場合にのみ、「g_cs」を同時に取得できます。その場合、この実行は安全なはずですか?

私の理解では、クリティカル セクション オブジェクトはプロセスに属しているため、問題は 2 つの dll の同期オブジェクトの共通名「g_cs」が原因である可能性があります。しかし、理論的にはそうであってはなりません。

4

1 に答える 1