ロック・デッドロック
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[+C#+スレッド・プロセス]]
#contents
*概要 [#h9193e6c]
排他制御とは、一度に1つのスレッドしかアクセスできない制...
デッドロックとは複数のスレッドが、リソースをロックしあ...
複数のリソースをロックしなくてはならないようであれば、...
C# の lock ステートメントはクリティカルセクションです。
#codeprettify{{
class Clazz{
private static object syncobj = new object();
public void Func1(){
lock(syncobj){
// コード1
}
}
public void Func2(){
lock(syncobj){
// コード2
}
}
}
}}
lock は上記のようにやれば、「コード1」を実行中に「コード...
#ちなみにこの方法は結構重いので、使いどころはよく考慮す...
** 线程间操作无效,从不是创建控件的线程访问它 [#t729e110]
#codeprettify{{
Action action = () =>
{
TimeBox.Text = TimeString;
};
Invoke(action);
}};
*なぜLockするか?何をLockする? [#h03a10fd]
スレッドの最も効率的な方法は非同期ですね、つまり、各スレ...
フォーマット:
#codeprettify{{
Lock(objectA)
{
//処理A
}
}}
意味は:
- objectAはそれをロックしましたか?ロックされていなかった...
- Lockしたら、「処理A」を処理しているところで、ほかのスレ...
- 「処理A」の処理が完了すると、objectAをリリースし、「処...
*lock(this)がいいか? [#r2081908]
ソースコードの例を見ましょう
#codeprettify{{
using System;
using System.Threading;
namespace Namespace1
{
class C1
{
private bool deadlocked = true;
//このメソッドはLockを利用している、Lockされてい...
public void LockMe(object o)
{
lock (this)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :...
Thread.Sleep(500);
}
}
}
//すべてのスレッドで同時にアクセスできるメソッド
public void DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
class Program
{
static void Main(string[] args)
{
C1 c1 = new C1();
//t1スレッド内にLockMeを呼び出して、deadloc...
Thread t1 = new Thread(c1.LockMe);
t1.Start(true);
Thread.Sleep(100);
//メインスレッドlock c1
lock (c1)
{
//Lockしないメソッドを呼び出す
c1.DoNotLockMe();
//Lockするメソッドを呼び出す、デッドロッ...
c1.LockMe(false);
}
}
}
}}
t1スレッド内に、LockeMeがLock(this)、つまりはMainメソ...
C1のコードを修正します。
#codeprettify{{
class C1
{
private bool deadlocked = true;
private object locker = new object();
//このメソッドはLockを利用している、Lockされてい...
public void LockMe(object o)
{
lock (locker)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :...
Thread.Sleep(500);
}
}
}
//すべてのスレッドで同時にアクセスできるメソッド
public void DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
}}
今回はあるオブジェクト(locker)をロック対象にする、LockM...
実行してみたら、t1がデッドロック現象がまた出ましたが、DoN...
ポイント:
+ Lock(this)の欠点は一つのスレッド(本例のt1)、あるメソ...
+ ロックするのはロック内の処理だけではなく、ロック自身も...
+ ほかの操作への影響がないprivateなオブジェクトをロックす...
#hr();
コメント:
#comment_kcaptcha
終了行:
[[+C#+スレッド・プロセス]]
#contents
*概要 [#h9193e6c]
排他制御とは、一度に1つのスレッドしかアクセスできない制...
デッドロックとは複数のスレッドが、リソースをロックしあ...
複数のリソースをロックしなくてはならないようであれば、...
C# の lock ステートメントはクリティカルセクションです。
#codeprettify{{
class Clazz{
private static object syncobj = new object();
public void Func1(){
lock(syncobj){
// コード1
}
}
public void Func2(){
lock(syncobj){
// コード2
}
}
}
}}
lock は上記のようにやれば、「コード1」を実行中に「コード...
#ちなみにこの方法は結構重いので、使いどころはよく考慮す...
** 线程间操作无效,从不是创建控件的线程访问它 [#t729e110]
#codeprettify{{
Action action = () =>
{
TimeBox.Text = TimeString;
};
Invoke(action);
}};
*なぜLockするか?何をLockする? [#h03a10fd]
スレッドの最も効率的な方法は非同期ですね、つまり、各スレ...
フォーマット:
#codeprettify{{
Lock(objectA)
{
//処理A
}
}}
意味は:
- objectAはそれをロックしましたか?ロックされていなかった...
- Lockしたら、「処理A」を処理しているところで、ほかのスレ...
- 「処理A」の処理が完了すると、objectAをリリースし、「処...
*lock(this)がいいか? [#r2081908]
ソースコードの例を見ましょう
#codeprettify{{
using System;
using System.Threading;
namespace Namespace1
{
class C1
{
private bool deadlocked = true;
//このメソッドはLockを利用している、Lockされてい...
public void LockMe(object o)
{
lock (this)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :...
Thread.Sleep(500);
}
}
}
//すべてのスレッドで同時にアクセスできるメソッド
public void DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
class Program
{
static void Main(string[] args)
{
C1 c1 = new C1();
//t1スレッド内にLockMeを呼び出して、deadloc...
Thread t1 = new Thread(c1.LockMe);
t1.Start(true);
Thread.Sleep(100);
//メインスレッドlock c1
lock (c1)
{
//Lockしないメソッドを呼び出す
c1.DoNotLockMe();
//Lockするメソッドを呼び出す、デッドロッ...
c1.LockMe(false);
}
}
}
}}
t1スレッド内に、LockeMeがLock(this)、つまりはMainメソ...
C1のコードを修正します。
#codeprettify{{
class C1
{
private bool deadlocked = true;
private object locker = new object();
//このメソッドはLockを利用している、Lockされてい...
public void LockMe(object o)
{
lock (locker)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :...
Thread.Sleep(500);
}
}
}
//すべてのスレッドで同時にアクセスできるメソッド
public void DoNotLockMe()
{
Console.WriteLine("I am not locked :)");
}
}
}}
今回はあるオブジェクト(locker)をロック対象にする、LockM...
実行してみたら、t1がデッドロック現象がまた出ましたが、DoN...
ポイント:
+ Lock(this)の欠点は一つのスレッド(本例のt1)、あるメソ...
+ ロックするのはロック内の処理だけではなく、ロック自身も...
+ ほかの操作への影響がないprivateなオブジェクトをロックす...
#hr();
コメント:
#comment_kcaptcha
ページ名: