ここから本文です

lockのなかでlockするとどうなりますか。下記の関数Dを短時間に何度も呼びます。

mak********さん

2014/1/301:18:15

lockのなかでlockするとどうなりますか。下記の関数Dを短時間に何度も呼びます。

関数D
{
lock(A){ lock(A){ 処理B } 処理C }
}

補足C# visual studio 2012です

閲覧数:
1,622
回答数:
4

違反報告

ベストアンサーに選ばれた回答

kon********さん

編集あり2014/1/402:16:49

B,CがDを呼んでいる場合は再帰呼び出しと呼ばれる
場合もありますが、そうでない場合、そう呼ばれる
ことはC言語では余りありません。
C#でのlockは関数ではなく、文法構造の一つになっている
ようです。
http://msdn.microsoft.com/ja-jp/library/c5kehkcz(v=vs.90).aspx
上のURLを見る限り、同一スレッドでのlockのネストは
ブロック対象ではないようです。
同様の文法構造を持つプログラミング言語でlockに相当する
排他制御指定をネストすると、それ自身がブロックされるものも
あるようです。(だからといってC#の使用を薦めているものでは
ありませんが)
この辺りは御自分で、サンプルプログラムを作って確認するのが
一番かと思います。
ちなみにやはりカテが異なります。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

mik********さん

2014/1/306:07:55

ほかの方も回答されていますが、再帰呼び出しといいます。
よく用いられる手法です。

たとえば、あるフォルダの中身を表示する様なプログラムがあげられます。
当然、そのフォルダの中にはさらにフォルダも入っていますし、ファイルも入っています。中のフォルダはその中のファイルやフォルダも一覧表示する場合に、再帰呼び出しするような作りになるかと思います。
再帰呼び出しの注意点は、コーディングを誤ると無限ループに陥る可能性があると言うことでしょうか。

あと、lock()という関数ですけどこれが例えばミューテックスやセマフォを意味しているなら、おそらくデッドロックします。無限ループ同様に、プログラムは永久に応答を返しません。
再帰構造が悪いのでは無く、unlock()していないからです。

yas********さん

2014/1/304:46:26

そのような手法を再帰呼出し(recursive call)と言います。
どうなるかは処理の記述によるので何とも言えません。
ただ手法としてはよくある手法です。
googleで「再帰呼出し」で検索するとある程度の内容やどういう使い道があるかわかると思います。

arb********さん

2014/1/301:55:53

lock関数の仕様によります。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる