[解決済み] ミューテックスとクリティカルセクションの違いは何ですか?
2022-05-16 13:52:22
質問
Linux、Windowsの観点から教えてください。
C#でプログラミングしているのですが、この2つの用語は違いがあるのでしょうか。例など、できる限り投稿してください...。
ありがとうございます。
どのように解決するのですか?
Windowsの場合、クリティカルセクションはミューテックスよりも軽量です。
ミューテックスはプロセス間で共有できますが、常にカーネルへのシステムコールが発生し、いくらかのオーバーヘッドがあります。
クリティカルセクションは、1 つのプロセス内でのみ使用できますが、競合の場合にのみカーネルモードに切り替わるという利点があります - 一般的なケースであるべき無競合取得は、信じられないほど高速です。 競合の場合、それらはカーネルに入り、何らかの同期プリミティブ (イベントやセマフォなど) で待機します。
私は、その 2 つの間の時間を比較する簡単なサンプル アプリケーションを書きました。 私のシステムでは、1,000,000 回の無制限の取得と解放の場合、ミューテックスは 1 秒以上かかります。 クリティカル セクションは、1,000,000 回の取得で ~50 ミリ秒かかります。
これはテスト コードです。これを実行すると、mutex が 1 番目または 2 番目の場合に同様の結果が得られたため、他の影響は見られません。
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
CRITICAL_SECTION critSec;
InitializeCriticalSection(&critSec);
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER start, end;
// Force code into memory, so we don't see any effects of paging.
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
}
QueryPerformanceCounter(&end);
int totalTimeCS = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);
// Force code into memory, so we don't see any effects of paging.
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);
}
QueryPerformanceCounter(&end);
int totalTime = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);
printf("Mutex: %d CritSec: %d\n", totalTime, totalTimeCS);
関連
-
[解決済み] テスト
-
[解決済み] TensorFlow : cuInitの呼び出しに失敗しました。CUDA_ERROR_NO_DEVICE
-
[解決済み] Windowsコマンドプロンプトのログをファイルに保存する
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] 静的型付け言語と動的型付け言語の違いは何ですか?
-
[解決済み] CygwinとMinGWの違いは何ですか?
-
[解決済み] デッドロックとライブロックの違いは何ですか?
-
[解決済み】「ローカルシステム」アカウントと「ネットワークサービス」アカウントの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Curlが内部コマンド、外部コマンド、操作可能なプログラム、バッチファイルとして認識されない。
-
[解決済み] openssl' は内部コマンドまたは外部コマンドとして認識されません。
-
[解決済み] 0|%0とは何ですか、どのように機能しますか?
-
Windowsはプリンタに接続できません、操作は失敗しました、エラー0x0000011b、解決策の1つです。
-
[解決済み] npm' は内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
[解決済み] バッチプログラムでのechoコマンドの動作について
-
[解決済み] Windowsからリモートサーバーへscpでローカルファイルをコピーする [終了しました]。
-
[解決済み] Windows CLIでタイムスタンプを使ったPingを打つ
-
[解決済み] Windowsコマンドプロンプトのログをファイルに保存する
-
[解決済み] XCOPYです。BATCHでプロンプトを出さずに全てを上書きする