0

COM のマルチ スレッド アパートメントとシングル スレッド アパートメントの違いを理解しています。

以下のコードを参照してください。

'VB.NET
Imports Project1
Imports System.Threading

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim t1 As New Thread(AddressOf PersonTest.Test2)
        Dim t2 As New Thread(AddressOf PersonTest.Test2)
        Dim t3 As New Thread(AddressOf PersonTest.Test2)
        t1.Name = "Test1"
        t2.Name = "Test2"
        t3.Name = "Test3"
        t1.Start()
        t2.Start()
        t3.Start()
    End Sub

End Class

Public Class PersonTest
    Public Shared Sub Test2()
        Try
            Dim c1 As Class1
            c1 = New Class1
            For test3 As Integer = 0 To 10000
                For test As Integer = 0 To 10000
                    Dim test2 As Short = c1.Add(CShort(test))
                    If test2 <> test + 1 Then
                        MsgBox("Problem here")
                    End If
                Next
            Next
            MsgBox("finished")
        Catch ex As Exception

        End Try
    End Sub
End Class

Public Class Person
    Public id As Integer
End Class

'VB6 - Project1.vbp,class1
Public Test2 As Integer

Public Function Add(ByVal TestParameter As Integer) As Integer
Test2 = TestParameter + 1
Add = Test2
End Function

私が読んだ内容に基づいて、複数のスレッドが Person.ID の値を同期から変更する可能性があるため、「MsgBox("Problem here")」が表示されることを期待しますが、このプログラムを何度もテストしましたが、一度も実行されたことはありません起こりました。スレッドでは「何も保証されていない」ことを理解しています。上記のコードは理論的に問題を引き起こす可能性がありますか? 答えが「いいえ」の場合、問題を引き起こすためにコードをどのように修正できますか? 私はスレッドセーフなコードを書く方法を学ぼうとしています.これを行うには、まずコードがスレッドセーフではない可能性があることを理解する必要があります.

4

2 に答える 2

1

あなたの問題のほとんどは、複数のスレッドが 1 つの値を更新する機会がないことのようです。

Class1各スレッドでは、 の独自のインスタンスを持つの新しいインスタンスを作成しているTest2ため、各スレッドはその上で動作する唯一のスレッドです。

コードをこれに変更すると、必要な問題が強制的に発生しますが、これがあなたの質問に答えるかどうかはわかりません...

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim pt = New PersonTest

    Dim t1 As New Thread(AddressOf pt.Test2)
    Dim t2 As New Thread(AddressOf pt.Test2)
    Dim t3 As New Thread(AddressOf pt.Test2)
    t1.Name = "Test1"
    t2.Name = "Test2"
    t3.Name = "Test3"
    t1.Start()
    t2.Start()
    t3.Start()


End Sub


Public Class PersonTest

    Private _class As New Class1

    Public Sub Test2()
        Try

            For test3 As Integer = 0 To 10000
                For test As Integer = 0 To 10000

                    Dim test2 = _class.Add(test)
                    If test2 <> test + 1 Then
                        MsgBox("Problem here")
                    End If
                Next
            Next
            MsgBox("Finished")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

Public Class Person
    Public id As Integer
End Class

Public Class Class1

    'VB6 - Project1.vbp,class1
    Public Test2 As Integer

    Public Function Add(ByVal TestParameter As Integer) As Integer
        Test2 = TestParameter + 1
        Add = Test2
    End Function

End Class
于 2013-04-11T10:13:11.367 に答える