Vb.netチュートリアル6-16SyncLockステートメントを使用したスレッドの同期



Vb Net Tutorial 6 16 Synchronizing Threads Using Synclock Statements



次のコードを見てください。

Sub sample12() For i As Integer = 0 To 5 Dim sample12_Thread As New Thread(AddressOf sample12_doALoop1) sample12_Thread.Start(i) Next Thread.Sleep(1000) Console.ReadKey() End Sub Sub sample12_doALoop1(ByVal number As Integer) Dim counter As Integer = CType(number, Integer) For i As Integer = 1 To 100 Console.Write(' ' & counter) Next End Sub

得られた結果は次のようになります。赤いボックスでマークした重要な場所は次のとおりです。



上記の出力が混乱していることがわかります。これは、スレッドがシステムによって制御されているためです。どこにあるのかわかりません。システムはスレッド1を停止してスレッド2を開始し、次にスレッド2を停止して実行中のスレッドを切り替えます。 ....もともと1000、100 1を完全に出力したかった...(なに?0から5の順に出力したい?100 0、1001を完全に出力する方法だけを話します...ではありません順序について言及する)このコードは実装できず、たまに正しくなる可能性があります。



上記の問題を解決するには、SyncLockステートメントを使用する必要があります。
MSDN:SyncLockステートメントは、複数のスレッドがステートメントブロックを同時に実行しないようにします。 SyncLockは、他のスレッドが実行しなくなるまで、個々のスレッドがステートメントのブロックに入るのを防ぎます。 SyncLockの最も一般的な使用法は、複数のスレッドによって同時に更新されることからデータを保護することです。データを操作するステートメントを中断せずに完了する必要がある場合は、それらをSyncLockブロックに入れます。使用方法は以下のとおりです。

SyncLock lockobject [ block ] ‘ statement block to be executed when the lock is exclusive End SyncLock

知っておく必要があるのは、Lockobjectは、次の条件を満たす必要があります。
1.値をNothingにすることはできません
2.インスタンスデータのロックオブジェクトを提供するためにMeキーワードを使用しないでください。
3は参照型である必要があり、整数などの値型は使用しないでください
4、スレッド間で共有できる変数として定義する必要があります。次の例はモジュールレベルの変数として定義されます

上記の紹介によると、変更されたコードは次のとおりです。



モジュールレベルの変数を定義します。

Private lockObj As Object

変更されたメインプログラム:

Sub sample12() lockObj = New Object For i As Integer = 0 To 5 Dim sample12_Thread As New Thread(AddressOf sample12_doALoop2) sample12_Thread.Start(i) Next Thread.Sleep(1000) Console.ReadKey() End Sub Sub sample12_doALoop2(ByVal number As Integer) Dim counter As Integer = CType(number, Integer) SyncLock lockObj For i As Integer = 1 To 100 Console.Write(' ' & counter) Next End SyncLock End Sub

子スレッドのループブロックコードをロックして、完全であることを確認します。結果は次のとおりです。

また、スレッドは0〜5の順序で呼び出されますが、出力の順序は制御されないことも強調されています。他のコードで実装されていない限り、誰にでも書いてもらいましょう。

.netプラットフォームでのC#とvbによる 。ネット 非常によく似ていますが、この記事はC#愛好家のためのリファレンスも提供できます。

詳細vb 。ネット 知識、ご覧ください Vb.netチュートリアルディレクトリ