2
2
open System
3
3
open System.Threading
4
4
5
- type Example () =
6
- [<ThreadStatic; DefaultValue>]
7
- static val mutable private previous : double
5
+ type ThreadLocal () =
6
+ [<ThreadStatic; DefaultValue>]
7
+ static val mutable private requestId : string option
8
8
9
- [<ThreadStatic; DefaultValue>]
10
- static val mutable private sum : double
11
-
12
- [<ThreadStatic; DefaultValue>]
13
- static val mutable private calls : int
9
+ static member PerformLogging () =
10
+ Console.WriteLine( $" Thread {Environment.CurrentManagedThreadId}: Logging request {ThreadLocal.requestId.Value}" )
14
11
15
- [<ThreadStatic; DefaultValue>]
16
- static val mutable private abnormal : bool
17
-
18
- static let mutable totalNumbers = 0
19
- static let countdown = new CountdownEvent( 1 )
20
- static let lockObj = obj ()
21
- let rand = Random()
12
+ static member PerformDatabaseOperation () =
13
+ Console.WriteLine( $" Thread {Environment.CurrentManagedThreadId}: Processing DB operation for request {ThreadLocal.requestId.Value}" )
22
14
15
+ static member ProcessRequest ( reqId : obj ) =
16
+ ThreadLocal.requestId <- Some( reqId :?> string)
17
+ ThreadLocal.PerformDatabaseOperation()
18
+ ThreadLocal.PerformLogging()
23
19
24
- member this.Execute () =
25
- for threads = 1 to 10 do
26
- let newThread = new Thread( ThreadStart this.GetRandomNumbers)
27
- countdown.AddCount()
28
- newThread.Name <- threads.ToString()
29
- newThread.Start()
30
- this.GetRandomNumbers()
31
- countdown.Wait()
32
- printfn $" {totalNumbers:N0} random numbers were generated."
20
+ [<EntryPoint>]
21
+ let main _ =
22
+ let thread1 = Thread( ThreadStart( fun () -> ThreadLocal.ProcessRequest( " REQ-001" )))
23
+ let thread2 = Thread( ThreadStart( fun () -> ThreadLocal.ProcessRequest( " REQ-002" )))
33
24
34
- member _.GetRandomNumbers () =
35
- let mutable i = 0
36
- while i < 2000000 do
37
- lock lockObj ( fun () ->
38
- let result = rand.NextDouble()
39
- Example.calls <- Example.calls + 1
40
- Interlocked.Increment & totalNumbers |> ignore
41
- // We should never get the same random number twice.
42
- if result = Example.previous then
43
- Example.abnormal <- true
44
- i <- 2000001 // break
45
- else
46
- Example.previous <- result
47
- Example.sum <- Example.sum + result )
48
- i <- i + 1
49
- // get last result
50
- if Example.abnormal then
51
- printfn $" Result is {Example.previous} in {Thread.CurrentThread.Name}"
52
-
53
- printfn $" Thread {Thread.CurrentThread.Name} finished random number generation."
54
- printfn $" Sum = {Example.sum:N4}, Mean = {Example.sum / float Example.calls:N4}, n = {Example.calls:N0}\n "
55
- countdown.Signal() |> ignore
25
+ thread1.Start()
26
+ thread2.Start()
27
+ thread1.Join()
28
+ thread2.Join()
56
29
57
- let ex = Example()
58
- Thread.CurrentThread.Name <- " Main"
59
- ex.Execute()
60
-
61
- // The example displays output similar to the following:
62
- // Thread 1 finished random number generation.
63
- // Sum = 1,000,556.7483, Mean = 0.5003, n = 2,000,000
64
- //
65
- // Thread 6 finished random number generation.
66
- // Sum = 999,704.3865, Mean = 0.4999, n = 2,000,000
67
- //
68
- // Thread 2 finished random number generation.
69
- // Sum = 999,680.8904, Mean = 0.4998, n = 2,000,000
70
- //
71
- // Thread 10 finished random number generation.
72
- // Sum = 999,437.5132, Mean = 0.4997, n = 2,000,000
73
- //
74
- // Thread 8 finished random number generation.
75
- // Sum = 1,000,663.7789, Mean = 0.5003, n = 2,000,000
76
- //
77
- // Thread 4 finished random number generation.
78
- // Sum = 999,379.5978, Mean = 0.4997, n = 2,000,000
79
- //
80
- // Thread 5 finished random number generation.
81
- // Sum = 1,000,011.0605, Mean = 0.5000, n = 2,000,000
82
- //
83
- // Thread 9 finished random number generation.
84
- // Sum = 1,000,637.4556, Mean = 0.5003, n = 2,000,000
85
- //
86
- // Thread Main finished random number generation.
87
- // Sum = 1,000,676.2381, Mean = 0.5003, n = 2,000,000
88
- //
89
- // Thread 3 finished random number generation.
90
- // Sum = 999,951.1025, Mean = 0.5000, n = 2,000,000
91
- //
92
- // Thread 7 finished random number generation.
93
- // Sum = 1,000,844.5217, Mean = 0.5004, n = 2,000,000
94
- //
95
- // 22,000,000 random numbers were generated.
30
+ Console.WriteLine( " Main thread execution completed." )
31
+ 0
96
32
// </Snippet1>
0 commit comments