C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

lockの排他制御が効かない?

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■94449 / inTopicNo.1)  lockの排他制御が効かない?
  
□投稿者/ chobi (1回)-(2020/04/13(Mon) 14:47:17)

分類:[C#] 

お世話になります。
ProcessはEnd(int num)というイベントを持つクラスでStart()してしばらくすると
Endイベントを発生させます。下記はそのEndイベントの処理部です。
排他制御がきちんと効いていれば、"A"、"B"を順番にプリントするはずですが、
"A"を連続して印刷します。 何かlockステートメントに関する認識が
おかしいようなのですが、教えていただけないでしょうか?

object LockObject = new LockObject();
Process_End(int num)
{
lock(LockObject)
{
Debug.Print("A");
   Process[0].Start();
Process[1].Start();
  Debug.Print("B");
}
}
引用返信 編集キー/
■94455 / inTopicNo.2)  Re[1]: lockの排他制御が効かない?
□投稿者/ shu (1223回)-(2020/04/13(Mon) 16:26:37)
No94449 (chobi さん) に返信

>
> object LockObject = new LockObject();
> Process_End(int num)
> {
> lock(LockObject)
@

> {
> Debug.Print("A");
>    Process[0].Start();
A

> Process[1].Start();
B

>   Debug.Print("B");
> }
> }
@のLockObjectと
Aより呼ばれるであろうEnd内のLockObjectと
Bより呼ばれるであろうEnd内のLockObject
が同じインスタンスになっていますでしょうか?


引用返信 編集キー/
■94456 / inTopicNo.3)  Re[1]: lockの排他制御が効かない?
□投稿者/ furu (25回)-(2020/04/13(Mon) 16:30:26)
No94449 (chobi さん) に返信
Process_End内でProcess[x].Start()を2回呼ぶで
認識合ってる?
どんどん増殖?

> ProcessはEnd(int num)というイベントを持つクラスでStart()してしばらくすると
> Endイベントを発生させます。下記はそのEndイベントの処理部です。
> 排他制御がきちんと効いていれば、"A"、"B"を順番にプリントするはずですが、
> "A"を連続して印刷します。 
Process[0].Start()して、しばらくする前に
Process[1].Start()と
Debug.Print("B")するからでは?
引用返信 編集キー/
■94460 / inTopicNo.4)  Re[1]: lockの排他制御が効かない?
□投稿者/ Azulean (1140回)-(2020/04/13(Mon) 17:46:50)
No94449 (chobi さん) に返信
> ProcessはEnd(int num)というイベントを持つクラスでStart()してしばらくすると
> Endイベントを発生させます。下記はそのEndイベントの処理部です。
> 排他制御がきちんと効いていれば、"A"、"B"を順番にプリントするはずですが、
> "A"を連続して印刷します。 何かlockステートメントに関する認識が
> おかしいようなのですが、教えていただけないでしょうか?

・lock ステートメントはあくまで「スレッド間」を排他するものであり、同じスレッドの再帰的な動きには効果がありません。
・再帰してきた場合にはじきたいなら、lock のような「終わるまで永久に待つ」仕組みを使うと、デッドロッドになりますので、自分でフラグ管理してください。
引用返信 編集キー/
■94468 / inTopicNo.5)  Re[2]: lockの排他制御が効かない?
□投稿者/ chobi (2回)-(2020/04/14(Tue) 09:23:48)
No94460 (Azulean さん) に返信
> ■No94449 (chobi さん) に返信
>>ProcessはEnd(int num)というイベントを持つクラスでStart()してしばらくすると
>>Endイベントを発生させます。下記はそのEndイベントの処理部です。
>>排他制御がきちんと効いていれば、"A"、"B"を順番にプリントするはずですが、
>>"A"を連続して印刷します。 何かlockステートメントに関する認識が
>>おかしいようなのですが、教えていただけないでしょうか?
>
> ・lock ステートメントはあくまで「スレッド間」を排他するものであり、同じスレッドの再帰的な動きには効果がありません。
> ・再帰してきた場合にはじきたいなら、lock のような「終わるまで永久に待つ」仕組みを使うと、デッドロッドになりますので、自分でフラグ管理してください。

お世話になります。ご指摘の通りです。
再帰をフラグで禁止するのではなく、すべてスレッドで開始[Start()]することで排他制御できました。
排他制御の認識がダメダメでした。ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ