C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
Re[2]: lockの排他制御が効かない?
(過去ログ 163 を表示中)
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
トピック表示
ランキング
記事検索
過去ログ
[トピック内 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
>>
このトピックに書きこむ
過去ログには書き込み不可
管理者用
-
Child Tree
-