C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

クラスを変数としたマルチスレッド処理

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■83085 / inTopicNo.1)  クラスを変数としたマルチスレッド処理
  
□投稿者/ べき (1回)-(2017/03/05(Sun) 19:58:46)

分類:[.NET 全般] 

以下のコードを実行すると、
ans1とans2に同じ8.0が代入されます。

一方で、
'Thread.Sleep(1)
このコメントアウトを外してやると
ans1には4.0、ans2には8.0が代入されます。

つまり、これは、
MultiTask1で変数を別のスレッドに投げきっていない状態で

temp2.X = 4
と値を書き換えたためだと思います。

このようなことを回避するためには、
Sleepで少し待ってやるか
クラスを新規作成して別のものを用いるしかないでしょうか?





Imports System.Threading.Tasks
Imports System.Threading

Module Module1


Private Class test

    Property X As Single

End Class


Sub XYZR()


Dim ques1 As New test
ques1.X = 10

Dim temp1 As test = ques1
temp1.X = 2
Dim MultiTask1 = New Task(Of Single)(AddressOf func, temp1)
MultiTask1.Start()

'Thread.Sleep(1)

Dim temp2 As test = ques1
temp2.X = 4
Dim MultiTask2 = New Task(Of Single)(AddressOf func, temp2)
MultiTask2.Start()


MultiTask1.Wait()
Dim ans1 As Single = MultiTask1.Result


MultiTask2.Wait()
Dim ans2 As Single = MultiTask2.Result

End Sub


Private Function func(ByVal g As test) As Single

    Return g.X * 2


End Function


End Module


引用返信 編集キー/
■83086 / inTopicNo.2)  Re[1]: クラスを変数としたマルチスレッド処理
□投稿者/ shu (969回)-(2017/03/05(Sun) 21:06:52)
No83085 (べき さん) に返信
>
> このようなことを回避するためには、
> Sleepで少し待ってやるか
> クラスを新規作成して別のものを用いるしかないでしょうか?
>
クラスを新しくつくる必要はなく
testクラスのインスタンスを新しく作ればよいです。

Sleepで少し待つというのは1つ目のタスクが完了していることに
なるのでスレッドを分けるいみがありません。
引用返信 編集キー/
■83090 / inTopicNo.3)  Re[1]: クラスを変数としたマルチスレッド処理
□投稿者/ とっちゃん (426回)-(2017/03/06(Mon) 11:28:47)
No83085 (べき さん) に返信

> Dim ques1 As New test
> Dim temp1 As test = ques1
> Dim temp2 As test = ques1

test は、class 宣言されているので、参照型です。

参照型は、実体(メモリ上のどこかにある)を指し示してデータを管理する型のため
temp1 = ques1
としている時点で、「同じオブジェクト」を「指して(参照して)」います。

temp1/temp2 でそれぞれ別々の演算をするのであれば、インスタンスを新たに用意し
そこに必要な情報をコピーするなどで対応する必要があります。

引用返信 編集キー/
■83092 / inTopicNo.4)  Re[2]: クラスを変数としたマルチスレッド処理
□投稿者/ べき (2回)-(2017/03/06(Mon) 15:58:44)
Byrefでしたか、納得しました。
ありがとうございます。
解決済み
引用返信 編集キー/
■83093 / inTopicNo.5)  Re[3]: クラスを変数としたマルチスレッド処理
□投稿者/ Jitta (276回)-(2017/03/06(Mon) 16:49:59)
No83092 (べき さん) に返信
> Byrefでしたか、納得しました。
> ありがとうございます。

ByRefは参照渡しのキーワードです。
参照渡しと参照型は違うものです。
解決済み
引用返信 編集キー/
■83100 / inTopicNo.6)  Re[4]: クラスを変数としたマルチスレッド処理
□投稿者/ べき (3回)-(2017/03/06(Mon) 19:18:17)
追記ありがとうございます。
 
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ