Skip to content

Commit 30943f6

Browse files
Update ThreadStatic example
1 parent 2427e62 commit 30943f6

File tree

3 files changed

+76
-59
lines changed

3 files changed

+76
-59
lines changed

snippets/csharp/System/ThreadStaticAttribute/Overview/threadsafe2a.cs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44

55
public class Example
66
{
7-
[ThreadStatic] static double previous = 0.0;
8-
[ThreadStatic] static double sum = 0.0;
9-
[ThreadStatic] static int calls = 0;
7+
[ThreadStatic] static double previous;
8+
[ThreadStatic] static double sum;
9+
[ThreadStatic] static int calls;
1010
[ThreadStatic] static bool abnormal;
1111
static int totalNumbers = 0;
1212
static CountdownEvent countdown;
1313
private static Object lockObj;
1414
Random rand;
15-
15+
1616
public Example()
17-
{
17+
{
1818
rand = new Random();
1919
lockObj = new Object();
2020
countdown = new CountdownEvent(1);
21-
}
21+
}
2222

2323
public static void Main()
2424
{
@@ -30,7 +30,7 @@ public static void Main()
3030
}
3131

3232
private void Execute()
33-
{
33+
{
3434
for (int threads = 1; threads <= 10; threads++)
3535
{
3636
Thread newThread = new Thread(new ThreadStart(this.GetRandomNumbers));
@@ -43,6 +43,12 @@ private void Execute()
4343

4444
private void GetRandomNumbers()
4545
{
46+
// Initialize ThreadStatic fields for this thread.
47+
previous = 0.0;
48+
sum = 0.0;
49+
calls = 0;
50+
abnormal = false;
51+
4652
double result = 0.0;
4753

4854
for (int ctr = 0; ctr < 2000000; ctr++)
@@ -59,51 +65,51 @@ private void GetRandomNumbers()
5965
else {
6066
previous = result;
6167
sum += result;
62-
}
68+
}
6369
}
6470
}
6571
// get last result
6672
if (abnormal)
6773
Console.WriteLine("Result is {0} in {1}", previous, Thread.CurrentThread.Name);
68-
74+
6975
Console.WriteLine("Thread {0} finished random number generation.", Thread.CurrentThread.Name);
70-
Console.WriteLine("Sum = {0:N4}, Mean = {1:N4}, n = {2:N0}\n", sum, sum/calls, calls);
76+
Console.WriteLine("Sum = {0:N4}, Mean = {1:N4}, n = {2:N0}\n", sum, sum/calls, calls);
7177
countdown.Signal();
7278
}
7379
}
7480
// The example displays output similar to the following:
7581
// Thread 1 finished random number generation.
7682
// Sum = 1,000,556.7483, Mean = 0.5003, n = 2,000,000
77-
//
83+
//
7884
// Thread 6 finished random number generation.
7985
// Sum = 999,704.3865, Mean = 0.4999, n = 2,000,000
80-
//
86+
//
8187
// Thread 2 finished random number generation.
8288
// Sum = 999,680.8904, Mean = 0.4998, n = 2,000,000
83-
//
89+
//
8490
// Thread 10 finished random number generation.
8591
// Sum = 999,437.5132, Mean = 0.4997, n = 2,000,000
86-
//
92+
//
8793
// Thread 8 finished random number generation.
8894
// Sum = 1,000,663.7789, Mean = 0.5003, n = 2,000,000
89-
//
95+
//
9096
// Thread 4 finished random number generation.
9197
// Sum = 999,379.5978, Mean = 0.4997, n = 2,000,000
92-
//
98+
//
9399
// Thread 5 finished random number generation.
94100
// Sum = 1,000,011.0605, Mean = 0.5000, n = 2,000,000
95-
//
101+
//
96102
// Thread 9 finished random number generation.
97103
// Sum = 1,000,637.4556, Mean = 0.5003, n = 2,000,000
98-
//
104+
//
99105
// Thread Main finished random number generation.
100106
// Sum = 1,000,676.2381, Mean = 0.5003, n = 2,000,000
101-
//
107+
//
102108
// Thread 3 finished random number generation.
103109
// Sum = 999,951.1025, Mean = 0.5000, n = 2,000,000
104-
//
110+
//
105111
// Thread 7 finished random number generation.
106112
// Sum = 1,000,844.5217, Mean = 0.5004, n = 2,000,000
107-
//
113+
//
108114
// 22,000,000 random numbers were generated.
109115
// </Snippet1>

snippets/fsharp/System/ThreadStaticAttribute/Overview/threadsafe2a.fs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ open System
33
open System.Threading
44

55
type Example() =
6-
[<ThreadStatic; DefaultValue>]
6+
[<ThreadStatic; DefaultValue>]
77
static val mutable private previous : double
88

9-
[<ThreadStatic; DefaultValue>]
9+
[<ThreadStatic; DefaultValue>]
1010
static val mutable private sum : double
11-
12-
[<ThreadStatic; DefaultValue>]
11+
12+
[<ThreadStatic; DefaultValue>]
1313
static val mutable private calls : int
1414

15-
[<ThreadStatic; DefaultValue>]
15+
[<ThreadStatic; DefaultValue>]
1616
static val mutable private abnormal : bool
17-
17+
1818
static let mutable totalNumbers = 0
1919
static let countdown = new CountdownEvent(1)
2020
static let lockObj = obj ()
@@ -32,6 +32,12 @@ type Example() =
3232
printfn $"{totalNumbers:N0} random numbers were generated."
3333

3434
member _.GetRandomNumbers() =
35+
// Initialize ThreadStatic fields for this thread.
36+
Example.previous <- 0.0
37+
Example.sum <- 0.0
38+
Example.calls <- 0
39+
Example.abnormal <- false
40+
3541
let mutable i = 0
3642
while i < 2000000 do
3743
lock lockObj (fun () ->
@@ -49,7 +55,7 @@ type Example() =
4955
// get last result
5056
if Example.abnormal then
5157
printfn $"Result is {Example.previous} in {Thread.CurrentThread.Name}"
52-
58+
5359
printfn $"Thread {Thread.CurrentThread.Name} finished random number generation."
5460
printfn $"Sum = {Example.sum:N4}, Mean = {Example.sum / float Example.calls:N4}, n = {Example.calls:N0}\n"
5561
countdown.Signal() |> ignore
@@ -61,36 +67,36 @@ ex.Execute()
6167
// The example displays output similar to the following:
6268
// Thread 1 finished random number generation.
6369
// Sum = 1,000,556.7483, Mean = 0.5003, n = 2,000,000
64-
//
70+
//
6571
// Thread 6 finished random number generation.
6672
// Sum = 999,704.3865, Mean = 0.4999, n = 2,000,000
67-
//
73+
//
6874
// Thread 2 finished random number generation.
6975
// Sum = 999,680.8904, Mean = 0.4998, n = 2,000,000
70-
//
76+
//
7177
// Thread 10 finished random number generation.
7278
// Sum = 999,437.5132, Mean = 0.4997, n = 2,000,000
73-
//
79+
//
7480
// Thread 8 finished random number generation.
7581
// Sum = 1,000,663.7789, Mean = 0.5003, n = 2,000,000
76-
//
82+
//
7783
// Thread 4 finished random number generation.
7884
// Sum = 999,379.5978, Mean = 0.4997, n = 2,000,000
79-
//
85+
//
8086
// Thread 5 finished random number generation.
8187
// Sum = 1,000,011.0605, Mean = 0.5000, n = 2,000,000
82-
//
88+
//
8389
// Thread 9 finished random number generation.
8490
// Sum = 1,000,637.4556, Mean = 0.5003, n = 2,000,000
85-
//
91+
//
8692
// Thread Main finished random number generation.
8793
// Sum = 1,000,676.2381, Mean = 0.5003, n = 2,000,000
88-
//
94+
//
8995
// Thread 3 finished random number generation.
9096
// Sum = 999,951.1025, Mean = 0.5000, n = 2,000,000
91-
//
97+
//
9298
// Thread 7 finished random number generation.
9399
// Sum = 1,000,844.5217, Mean = 0.5004, n = 2,000,000
94-
//
100+
//
95101
// 22,000,000 random numbers were generated.
96102
// </Snippet1>

snippets/visualbasic/VS_Snippets_CLR_System/system.threadstaticattribute/vb/threadsafe2a.vb

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ Option Strict On
55
Imports System.Threading
66

77
Public Class Example
8-
<ThreadStatic> Shared previous As Double = 0.0
9-
<ThreadStatic> Shared sum As Double = 0.0
10-
<ThreadStatic> Shared calls As Integer = 0
8+
<ThreadStatic> Shared previous As Double
9+
<ThreadStatic> Shared sum As Double
10+
<ThreadStatic> Shared calls As Integer
1111
<ThreadStatic> Shared abnormal As Boolean
1212
Shared totalNumbers As Integer = 0
1313
Shared countdown As CountdownEvent
@@ -39,9 +39,14 @@ Public Class Example
3939
End Sub
4040

4141
Private Sub GetRandomNumbers()
42+
' Initialize ThreadStatic fields for this thread.
43+
previous = 0.0
44+
sum = 0.0
45+
calls = 0
46+
abnormal = False
47+
4248
Dim result As Double = 0.0
43-
44-
49+
4550
For ctr As Integer = 1 To 2000000
4651
SyncLock lockObj
4752
result = rand.NextDouble()
@@ -54,53 +59,53 @@ Public Class Example
5459
Else
5560
previous = result
5661
sum += result
57-
End If
62+
End If
5863
End SyncLock
5964
Next
6065
' Get last result.
6166
If abnormal Then
6267
Console.WriteLine("Result is {0} in {1}", previous, Thread.CurrentThread.Name)
63-
End If
64-
68+
End If
69+
6570
Console.WriteLine("Thread {0} finished random number generation.", Thread.CurrentThread.Name)
6671
Console.WriteLine("Sum = {0:N4}, Mean = {1:N4}, n = {2:N0}", sum, sum/calls, calls)
67-
Console.WriteLine()
72+
Console.WriteLine()
6873
countdown.Signal()
6974
End Sub
7075
End Class
7176
' The example displays output similar to the following:
7277
' Thread 1 finished random number generation.
7378
' Sum = 1,000,556.7483, Mean = 0.5003, n = 2,000,000
74-
'
79+
'
7580
' Thread 6 finished random number generation.
7681
' Sum = 999,704.3865, Mean = 0.4999, n = 2,000,000
77-
'
82+
'
7883
' Thread 2 finished random number generation.
7984
' Sum = 999,680.8904, Mean = 0.4998, n = 2,000,000
80-
'
85+
'
8186
' Thread 10 finished random number generation.
8287
' Sum = 999,437.5132, Mean = 0.4997, n = 2,000,000
83-
'
88+
'
8489
' Thread 8 finished random number generation.
8590
' Sum = 1,000,663.7789, Mean = 0.5003, n = 2,000,000
86-
'
91+
'
8792
' Thread 4 finished random number generation.
8893
' Sum = 999,379.5978, Mean = 0.4997, n = 2,000,000
89-
'
94+
'
9095
' Thread 5 finished random number generation.
9196
' Sum = 1,000,011.0605, Mean = 0.5000, n = 2,000,000
92-
'
97+
'
9398
' Thread 9 finished random number generation.
9499
' Sum = 1,000,637.4556, Mean = 0.5003, n = 2,000,000
95-
'
100+
'
96101
' Thread Main finished random number generation.
97102
' Sum = 1,000,676.2381, Mean = 0.5003, n = 2,000,000
98-
'
103+
'
99104
' Thread 3 finished random number generation.
100105
' Sum = 999,951.1025, Mean = 0.5000, n = 2,000,000
101-
'
106+
'
102107
' Thread 7 finished random number generation.
103108
' Sum = 1,000,844.5217, Mean = 0.5004, n = 2,000,000
104-
'
109+
'
105110
' 22,000,000 random numbers were generated.
106111
' </Snippet1>

0 commit comments

Comments
 (0)