DoboWiki
Top
> .NETプログラミング研究/22 をテンプレートにして作成
.NETプログラミング研究/22 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第22号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第22号 [#w64698eb]
**.NET Tips [#k2d77964]
***.NETのマルチスレッドプログラミング その4 [#j46065a5]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***ManualResetEvent、AutoResetEvent、Mutexクラスの使い方 ...
ManualResetEvent、AutoResetEvent及びMutexクラスは、WaitHa...
これらのクラスのオブジェクト(「待機ハンドル」と呼ばれる...
スレッドが待機ハンドルの所有を要求するには、待機メソッド...
(補足:ただし、これらのクラスはWin32同期ハンドルをカプセ...
''ManualResetEvent、AutoResetEventクラス''
ManualResetEvent、AutoResetEventオブジェクトは、「同期イ...
はじめに、同期イベントを使ってスレッドの同期を行う基本的...
次のコードでは、ManualResetEvent.WaitOneメソッドによりメ...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared manualEvent As ManualResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventオブジェクトを作成
manualEvent = New ManualResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
t1.Start()
'シグナル状態になるまでスレッドをブロックする
manualEvent.WaitOne()
Console.WriteLine("メインスレッド終了")
Console.ReadLine()
End Sub
Public Shared Sub MyMethod()
Console.WriteLine("{0}:スレッド開始", Thread.CurrentT...
'何か仕事をするものとする
Thread.Sleep(1000)
'シグナル状態にする
manualEvent.Set()
Console.WriteLine("{0}:スレッド終了", Thread.CurrentT...
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static ManualResetEvent manualEvent;
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventオブジェクトを作成
manualEvent = new ManualResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod));
t1.Name = "1";
t1.Start();
//シグナル状態になるまでスレッドをブロックする
manualEvent.WaitOne();
Console.WriteLine("メインスレッド終了");
Console.ReadLine();
}
public static void MyMethod()
{
Console.WriteLine("{0}:スレッド開始", Thread.CurrentT...
//何か仕事をするものとする
Thread.Sleep(1000);
//シグナル状態にする
manualEvent.Set();
Console.WriteLine("{0}:スレッド終了", Thread.CurrentT...
}
}}
次にManualResetEventを使って、2つのスレッドを交互に実行す...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared manualEvent1 As ManualResetEvent
Public Shared manualEvent2 As ManualResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventオブジェクトを作成
manualEvent1 = New ManualResetEvent(False)
manualEvent2 = New ManualResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
manualEvent1.Set()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'manualEvent1がシグナル状態になるまでスレッドをブ...
manualEvent1.WaitOne()
'manualEvent1を非シグナル状態にする
manualEvent1.Reset()
Console.Write(Thread.CurrentThread.Name)
'manualEvent2をシグナル状態にする
manualEvent2.Set()
Next i
End Sub
Public Shared Sub MyMethod2()
Dim i As Integer
For i = 0 To 99
'manualEvent2がシグナル状態になるまでスレッドをブ...
manualEvent2.WaitOne()
'manualEvent2を非シグナル状態にする
manualEvent2.Reset()
Console.Write(Thread.CurrentThread.Name)
'manualEvent1をシグナル状態にする
manualEvent1.Set()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static ManualResetEvent manualEvent1;
public static ManualResetEvent manualEvent2;
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventオブジェクトを作成
manualEvent1 = new ManualResetEvent(false);
manualEvent2 = new ManualResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod2));
t2.Name = "2";
t1.Start();
t2.Start();
//manualEvent1をシグナル状態にする
manualEvent1.Set();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//manualEvent1がシグナル状態になるまでスレッドを...
manualEvent1.WaitOne();
//manualEvent1を非シグナル状態にする
manualEvent1.Reset();
Console.Write(Thread.CurrentThread.Name);
//manualEvent2をシグナル状態にする
manualEvent2.Set();
}
}
public static void MyMethod2()
{
for (int i = 0; i < 100; i++)
{
//manualEvent2がシグナル状態になるまでスレッドを...
manualEvent2.WaitOne();
//manualEvent2を非シグナル状態にする
manualEvent2.Reset();
Console.Write(Thread.CurrentThread.Name);
//manualEvent1をシグナル状態にする
manualEvent1.Set();
}
}
}}
#pre{{
//出力結果例:
//1212121212121212121212121212121212121212121212121212121...
//1212121212121212121212121212121212121212121212121212121...
//1212121212121212121212121212121212121212121212121212121...
}}
上記のコードではManualResetEvent.WaitOneメソッドの後すぐ...
以下に上記のコードをAutoResetEventを使って書き換えた例を...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared autoEvent1 As AutoResetEvent
Public Shared autoEvent2 As AutoResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でAutoResetEventオブジェクトを作成
autoEvent1 = New AutoResetEvent(False)
autoEvent2 = New AutoResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
'autoEvent1をシグナル状態にする
autoEvent1.Set()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'autoEvent1がシグナル状態になるまでスレッドをブロ...
autoEvent1.WaitOne()
Console.Write(Thread.CurrentThread.Name)
'autoEvent2をシグナル状態にする
autoEvent2.Set()
Next i
End Sub
Public Shared Sub MyMethod2()
Dim i As Integer
For i = 0 To 99
'autoEvent2がシグナル状態になるまでスレッドをブロ...
autoEvent2.WaitOne()
Console.Write(Thread.CurrentThread.Name)
'autoEvent1をシグナル状態にする
autoEvent1.Set()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static AutoResetEvent autoEvent1;
public static AutoResetEvent autoEvent2;
//エントリポイント
public static void Main()
{
//非シグナル状態でAutoResetEventオブジェクトを作成
autoEvent1 = new AutoResetEvent(false);
autoEvent2 = new AutoResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod2));
t2.Name = "2";
t1.Start();
t2.Start();
//autoEvent1をシグナル状態にする
autoEvent1.Set();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//autoEvent1がシグナル状態になるまでスレッドをブ...
autoEvent1.WaitOne();
Console.Write(Thread.CurrentThread.Name);
//autoEvent2をシグナル状態にする
autoEvent2.Set();
}
}
public static void MyMethod2()
{
for (int i = 0; i < 100; i++)
{
//autoEvent2がシグナル状態になるまでスレッドをブ...
autoEvent2.WaitOne();
Console.Write(Thread.CurrentThread.Name);
//autoEvent1をシグナル状態にする
autoEvent1.Set();
}
}
}}
複数の待機ハンドルのシグナル状態により待機が解除されるよ...
''Mutexクラス''
Mutexは同時に1つのスレッドでしか所有できない同期オブジェ...
Mutexを使用して同期を行う基本的な方法は、次のようなもので...
なお、ミューテックスを所有しているスレッドがさらにWaitOne...
Mutexを使用した簡単な例を次に示します。MyMethod1メソッド...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared mut As Mutex
'エントリポイント
Public Shared Sub Main()
'Mutexオブジェクトを作成(初期所有権なし)
mut = New Mutex
'2つのスレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'ミューテックスの所有権を要求する
'取得できない時は、取得できるまで待機
mut.WaitOne()
'同期されたコードブロック
Console.Write(Thread.CurrentThread.Name)
'Mutexを解放する
mut.ReleaseMutex()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static Mutex mut;
//エントリポイント
public static void Main()
{
//Mutexオブジェクトを作成(初期所有権なし)
mut = new Mutex();
//2つのスレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod1));
t2.Name = "2";
t1.Start();
t2.Start();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//ミューテックスの所有権を要求する
//取得できない時は、取得できるまで待機
mut.WaitOne();
//同期されたコードブロック
Console.Write(Thread.CurrentThread.Name);
//Mutexを解放する
mut.ReleaseMutex();
}
}
}}
Mutexの大きな特徴としてはさらに、スレッド間の同期だけでは...
-[[.NET Tips - 二重起動を禁止する>https://dobon.net/vb/do...
参考:
-[[WaitHandle>http://www.microsoft.com/japan/msdn/library...
-[[WaitHandle クラス>http://www.microsoft.com/japan/msdn/...
-[[AutoResetEvent クラス>http://www.microsoft.com/japan/m...
-[[ManualResetEvent クラス>http://www.microsoft.com/japan...
-[[Mutex クラス>http://www.microsoft.com/japan/msdn/libra...
-[[高度な同期化技法>http://www.microsoft.com/japan/msdn/l...
**コメント [#s274d65c]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-12-03 (水) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第22号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第22号 [#w64698eb]
**.NET Tips [#k2d77964]
***.NETのマルチスレッドプログラミング その4 [#j46065a5]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***ManualResetEvent、AutoResetEvent、Mutexクラスの使い方 ...
ManualResetEvent、AutoResetEvent及びMutexクラスは、WaitHa...
これらのクラスのオブジェクト(「待機ハンドル」と呼ばれる...
スレッドが待機ハンドルの所有を要求するには、待機メソッド...
(補足:ただし、これらのクラスはWin32同期ハンドルをカプセ...
''ManualResetEvent、AutoResetEventクラス''
ManualResetEvent、AutoResetEventオブジェクトは、「同期イ...
はじめに、同期イベントを使ってスレッドの同期を行う基本的...
次のコードでは、ManualResetEvent.WaitOneメソッドによりメ...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared manualEvent As ManualResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventオブジェクトを作成
manualEvent = New ManualResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
t1.Start()
'シグナル状態になるまでスレッドをブロックする
manualEvent.WaitOne()
Console.WriteLine("メインスレッド終了")
Console.ReadLine()
End Sub
Public Shared Sub MyMethod()
Console.WriteLine("{0}:スレッド開始", Thread.CurrentT...
'何か仕事をするものとする
Thread.Sleep(1000)
'シグナル状態にする
manualEvent.Set()
Console.WriteLine("{0}:スレッド終了", Thread.CurrentT...
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static ManualResetEvent manualEvent;
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventオブジェクトを作成
manualEvent = new ManualResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod));
t1.Name = "1";
t1.Start();
//シグナル状態になるまでスレッドをブロックする
manualEvent.WaitOne();
Console.WriteLine("メインスレッド終了");
Console.ReadLine();
}
public static void MyMethod()
{
Console.WriteLine("{0}:スレッド開始", Thread.CurrentT...
//何か仕事をするものとする
Thread.Sleep(1000);
//シグナル状態にする
manualEvent.Set();
Console.WriteLine("{0}:スレッド終了", Thread.CurrentT...
}
}}
次にManualResetEventを使って、2つのスレッドを交互に実行す...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared manualEvent1 As ManualResetEvent
Public Shared manualEvent2 As ManualResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventオブジェクトを作成
manualEvent1 = New ManualResetEvent(False)
manualEvent2 = New ManualResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
manualEvent1.Set()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'manualEvent1がシグナル状態になるまでスレッドをブ...
manualEvent1.WaitOne()
'manualEvent1を非シグナル状態にする
manualEvent1.Reset()
Console.Write(Thread.CurrentThread.Name)
'manualEvent2をシグナル状態にする
manualEvent2.Set()
Next i
End Sub
Public Shared Sub MyMethod2()
Dim i As Integer
For i = 0 To 99
'manualEvent2がシグナル状態になるまでスレッドをブ...
manualEvent2.WaitOne()
'manualEvent2を非シグナル状態にする
manualEvent2.Reset()
Console.Write(Thread.CurrentThread.Name)
'manualEvent1をシグナル状態にする
manualEvent1.Set()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static ManualResetEvent manualEvent1;
public static ManualResetEvent manualEvent2;
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventオブジェクトを作成
manualEvent1 = new ManualResetEvent(false);
manualEvent2 = new ManualResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod2));
t2.Name = "2";
t1.Start();
t2.Start();
//manualEvent1をシグナル状態にする
manualEvent1.Set();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//manualEvent1がシグナル状態になるまでスレッドを...
manualEvent1.WaitOne();
//manualEvent1を非シグナル状態にする
manualEvent1.Reset();
Console.Write(Thread.CurrentThread.Name);
//manualEvent2をシグナル状態にする
manualEvent2.Set();
}
}
public static void MyMethod2()
{
for (int i = 0; i < 100; i++)
{
//manualEvent2がシグナル状態になるまでスレッドを...
manualEvent2.WaitOne();
//manualEvent2を非シグナル状態にする
manualEvent2.Reset();
Console.Write(Thread.CurrentThread.Name);
//manualEvent1をシグナル状態にする
manualEvent1.Set();
}
}
}}
#pre{{
//出力結果例:
//1212121212121212121212121212121212121212121212121212121...
//1212121212121212121212121212121212121212121212121212121...
//1212121212121212121212121212121212121212121212121212121...
}}
上記のコードではManualResetEvent.WaitOneメソッドの後すぐ...
以下に上記のコードをAutoResetEventを使って書き換えた例を...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared autoEvent1 As AutoResetEvent
Public Shared autoEvent2 As AutoResetEvent
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でAutoResetEventオブジェクトを作成
autoEvent1 = New AutoResetEvent(False)
autoEvent2 = New AutoResetEvent(False)
'スレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
'autoEvent1をシグナル状態にする
autoEvent1.Set()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'autoEvent1がシグナル状態になるまでスレッドをブロ...
autoEvent1.WaitOne()
Console.Write(Thread.CurrentThread.Name)
'autoEvent2をシグナル状態にする
autoEvent2.Set()
Next i
End Sub
Public Shared Sub MyMethod2()
Dim i As Integer
For i = 0 To 99
'autoEvent2がシグナル状態になるまでスレッドをブロ...
autoEvent2.WaitOne()
Console.Write(Thread.CurrentThread.Name)
'autoEvent1をシグナル状態にする
autoEvent1.Set()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static AutoResetEvent autoEvent1;
public static AutoResetEvent autoEvent2;
//エントリポイント
public static void Main()
{
//非シグナル状態でAutoResetEventオブジェクトを作成
autoEvent1 = new AutoResetEvent(false);
autoEvent2 = new AutoResetEvent(false);
//スレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod2));
t2.Name = "2";
t1.Start();
t2.Start();
//autoEvent1をシグナル状態にする
autoEvent1.Set();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//autoEvent1がシグナル状態になるまでスレッドをブ...
autoEvent1.WaitOne();
Console.Write(Thread.CurrentThread.Name);
//autoEvent2をシグナル状態にする
autoEvent2.Set();
}
}
public static void MyMethod2()
{
for (int i = 0; i < 100; i++)
{
//autoEvent2がシグナル状態になるまでスレッドをブ...
autoEvent2.WaitOne();
Console.Write(Thread.CurrentThread.Name);
//autoEvent1をシグナル状態にする
autoEvent1.Set();
}
}
}}
複数の待機ハンドルのシグナル状態により待機が解除されるよ...
''Mutexクラス''
Mutexは同時に1つのスレッドでしか所有できない同期オブジェ...
Mutexを使用して同期を行う基本的な方法は、次のようなもので...
なお、ミューテックスを所有しているスレッドがさらにWaitOne...
Mutexを使用した簡単な例を次に示します。MyMethod1メソッド...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Public Shared mut As Mutex
'エントリポイント
Public Shared Sub Main()
'Mutexオブジェクトを作成(初期所有権なし)
mut = New Mutex
'2つのスレッドを作成し、開始する
Dim t1 As New Thread(New ThreadStart(AddressOf MyMeth...
t1.Name = "1"
Dim t2 As New Thread(New ThreadStart(AddressOf MyMeth...
t2.Name = "2"
t1.Start()
t2.Start()
Console.ReadLine()
End Sub
Public Shared Sub MyMethod1()
Dim i As Integer
For i = 0 To 99
'ミューテックスの所有権を要求する
'取得できない時は、取得できるまで待機
mut.WaitOne()
'同期されたコードブロック
Console.Write(Thread.CurrentThread.Name)
'Mutexを解放する
mut.ReleaseMutex()
Next i
End Sub
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
public static Mutex mut;
//エントリポイント
public static void Main()
{
//Mutexオブジェクトを作成(初期所有権なし)
mut = new Mutex();
//2つのスレッドを作成し、開始する
Thread t1 = new Thread(new ThreadStart(MyMethod1));
t1.Name = "1";
Thread t2 = new Thread(new ThreadStart(MyMethod1));
t2.Name = "2";
t1.Start();
t2.Start();
Console.ReadLine();
}
public static void MyMethod1()
{
for (int i = 0; i < 100; i++)
{
//ミューテックスの所有権を要求する
//取得できない時は、取得できるまで待機
mut.WaitOne();
//同期されたコードブロック
Console.Write(Thread.CurrentThread.Name);
//Mutexを解放する
mut.ReleaseMutex();
}
}
}}
Mutexの大きな特徴としてはさらに、スレッド間の同期だけでは...
-[[.NET Tips - 二重起動を禁止する>https://dobon.net/vb/do...
参考:
-[[WaitHandle>http://www.microsoft.com/japan/msdn/library...
-[[WaitHandle クラス>http://www.microsoft.com/japan/msdn/...
-[[AutoResetEvent クラス>http://www.microsoft.com/japan/m...
-[[ManualResetEvent クラス>http://www.microsoft.com/japan...
-[[Mutex クラス>http://www.microsoft.com/japan/msdn/libra...
-[[高度な同期化技法>http://www.microsoft.com/japan/msdn/l...
**コメント [#s274d65c]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-12-03 (水) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]