関数とサブ関数で呼び出されている同じクリティカルセクション

ドミニク

私はサポートエンジニアとして働いていますが、失敗したプロセスのダンプで、いくつかのロックがあることがわかります。

Windbgの使用(Visual Studioは呼び出しスタックを正しく処理できません)1つの関数(ClassName::F())が戻ってきていることがわかりましたその関数はクリティカルセクションを使用しClassName::f_sub()、同じクリティカルセクションを呼び出しているサブ関数()を簡単に呼び出します。

int ClassName::f_sub(){
  EnterCriticalSection(&m_cs);
  ...
  LeaveCriticalSection(&m_cs);
  return ...;
}

int ClassName::F() {
  EnterCriticalSection(&m_cs);
  ...
  int temp = f_sub();
  ...
  LeaveCriticalSection(&m_cs);
  return ...;
}

毎回、同じクリティカルセクションm_cs(のプロパティClassName)が使用されています。

私の意見では、これにより次のシーケンスが可能になります。

Thread 1 : F()     : Enter the critical section. (Thread 1 is in)
Thread 1 : f_sub() : Enter the critical section. (Thread 1 is in)
Thread 1 : f_sub() : Leave the critical section. (Thread 1 is out)
Thread 2 : F()     : Enter the critical section. (Thread 2 is in) 

=> WRONG! Thread 2 should be forced to wait for Thread 1 leaving the critical section via F().

私の分析は正しいですか?これは、メイン機能とサブ機能に異なるクリティカルセクションを設けることをお勧めすることを意味しますか?

tkausl

私の分析は正しいですか?これは、メイン機能とサブ機能に異なるクリティカルセクションを設けることをお勧めすることを意味しますか?

以下からのMicrosoftドキュメント(強調鉱山):

スレッドがクリティカルセクションの所有権を取得した後、その実行をブロックすることなく、EnterCriticalSectionまたはTryEnterCriticalSectionを追加で呼び出すことができます。これにより、スレッドがすでに所有しているクリティカルセクションを待機しているときに、スレッドがデッドロックするのを防ぎます。EnterCriticalSectionとTryEnterCriticalSectionが成功するたびに、スレッドはクリティカルセクションに入ります。スレッドは、クリティカルセクションに入るたびにLeaveCriticalSectionを1回呼び出す必要があります。

いいえ、あなたが説明したことは起こらないはずです。クリティカルセクションに何度も入るのはまったく問題ありませんし、正確に何回も出る必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ディクショナリ値として保存されているときに関数を呼び出す

分類Dev

同じ関数でタイマーを表示するJavaScript関数を呼び出す前にラベルをクリアしてください[セッションタイムアウト]

分類Dev

Oracle関数を呼び出すJPAネイティブクエリは、同じトランザクションコンテキストの異なる呼び出しで同じオブジェクトを返します

分類Dev

Angularディレクティブのリンク関数が呼び出されていない

分類Dev

関数が同じサブスクリプション内のロジックアプリによって呼び出された場合、Azure関数の承認は適用されますか?

分類Dev

インタラクティブなエリクサーシェルを起動して、すぐに関数を呼び出すことは可能ですか?

分類Dev

グラフサブスクリプションにサブスクライブされているAzure関数のセキュリティ保護

分類Dev

同じクリックイベント内で別の関数を呼び出しているときに、JavaScript関数がコードビハインドから呼び出されない

分類Dev

複数回同じオプションがクリックされたときにng-changeで関数を呼び出す

分類Dev

AngularJSディレクティブ内のトランスクルージョンされた要素をクリックして関数を呼び出す

分類Dev

ngRepeatで複数回呼び出されるディレクティブリンク関数

分類Dev

同じ関数が2つの異なるアクティビティで2回呼び出されます

分類Dev

サブシェルにエクスポートされていない関数を呼び出すことができるのはなぜですか?

分類Dev

Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

分類Dev

サードパーティのライブラリによって呼び出されるコールバック関数内でオブジェクト/変数を渡す/アクセス可能にする方法は?

分類Dev

テストされているメイン関数で呼び出されるモック静的関数

分類Dev

呼び出し元の関数が同じファイルで定義されている場合、Cで関数をモックする方法は?

分類Dev

AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

分類Dev

AngularJSディレクティブリンク関数が呼び出されない

分類Dev

同じフォルダで定義されている別の関数を呼び出す場合、「モジュール」オブジェクトを呼び出すことはできません

分類Dev

$ parsersの関数-カスタムディレクティブで呼び出されない配列

分類Dev

アプリケーションが非アクティブ/終了時に openURL 関数が呼び出されない

分類Dev

AngularJSリンク関数が呼び出されていない

分類Dev

そのアリティ(またはコンパイル時に知られている他の情報)に応じて、関数オブジェクトを異なる方法で呼び出すにはどうすればよいですか?

分類Dev

ジェストと酵素でテストしている間、クリックイベントでモック関数が呼び出されない

分類Dev

親ディレクティブのangularjs関数がトランスクルージョンされたhtmlから呼び出されない

分類Dev

タブを閉じたときにuseEffectクリーニング関数が呼び出されない

分類Dev

リフレクション:C#7.0でローカル関数を見つけて呼び出すにはどうすればよいですか?

分類Dev

Meteor サブスクリプションの準備ができたときに関数を呼び出す方法

Related 関連記事

  1. 1

    ディクショナリ値として保存されているときに関数を呼び出す

  2. 2

    同じ関数でタイマーを表示するJavaScript関数を呼び出す前にラベルをクリアしてください[セッションタイムアウト]

  3. 3

    Oracle関数を呼び出すJPAネイティブクエリは、同じトランザクションコンテキストの異なる呼び出しで同じオブジェクトを返します

  4. 4

    Angularディレクティブのリンク関数が呼び出されていない

  5. 5

    関数が同じサブスクリプション内のロジックアプリによって呼び出された場合、Azure関数の承認は適用されますか?

  6. 6

    インタラクティブなエリクサーシェルを起動して、すぐに関数を呼び出すことは可能ですか?

  7. 7

    グラフサブスクリプションにサブスクライブされているAzure関数のセキュリティ保護

  8. 8

    同じクリックイベント内で別の関数を呼び出しているときに、JavaScript関数がコードビハインドから呼び出されない

  9. 9

    複数回同じオプションがクリックされたときにng-changeで関数を呼び出す

  10. 10

    AngularJSディレクティブ内のトランスクルージョンされた要素をクリックして関数を呼び出す

  11. 11

    ngRepeatで複数回呼び出されるディレクティブリンク関数

  12. 12

    同じ関数が2つの異なるアクティビティで2回呼び出されます

  13. 13

    サブシェルにエクスポートされていない関数を呼び出すことができるのはなぜですか?

  14. 14

    Lua C API関数がクラスメンバーとして呼び出されたのか、それともテーブルから関数として呼び出されたのかを判断するにはどうすればよいですか?

  15. 15

    サードパーティのライブラリによって呼び出されるコールバック関数内でオブジェクト/変数を渡す/アクセス可能にする方法は?

  16. 16

    テストされているメイン関数で呼び出されるモック静的関数

  17. 17

    呼び出し元の関数が同じファイルで定義されている場合、Cで関数をモックする方法は?

  18. 18

    AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

  19. 19

    AngularJSディレクティブリンク関数が呼び出されない

  20. 20

    同じフォルダで定義されている別の関数を呼び出す場合、「モジュール」オブジェクトを呼び出すことはできません

  21. 21

    $ parsersの関数-カスタムディレクティブで呼び出されない配列

  22. 22

    アプリケーションが非アクティブ/終了時に openURL 関数が呼び出されない

  23. 23

    AngularJSリンク関数が呼び出されていない

  24. 24

    そのアリティ(またはコンパイル時に知られている他の情報)に応じて、関数オブジェクトを異なる方法で呼び出すにはどうすればよいですか?

  25. 25

    ジェストと酵素でテストしている間、クリックイベントでモック関数が呼び出されない

  26. 26

    親ディレクティブのangularjs関数がトランスクルージョンされたhtmlから呼び出されない

  27. 27

    タブを閉じたときにuseEffectクリーニング関数が呼び出されない

  28. 28

    リフレクション:C#7.0でローカル関数を見つけて呼び出すにはどうすればよいですか?

  29. 29

    Meteor サブスクリプションの準備ができたときに関数を呼び出す方法

ホットタグ

アーカイブ