Thread-local-storage: Named slots
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
public class MainClass
{
public static void Main()
{
Thread.SetData(Thread.AllocateNamedDataSlot("TestSlot"), 126);
int slotValue2 = (int)Thread.GetData(Thread.GetNamedDataSlot("TestSlot"));
Console.WriteLine(slotValue2);
}
}
126
Thread-local-storage: Unnamed slots
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
public class MainClass
{
public static void Main()
{
LocalDataStoreSlot slot = Thread.AllocateDataSlot();
Thread.SetData(slot, 63);
int slotValue1 = (int)Thread.GetData(slot);
Console.WriteLine(slotValue1);
}
}
63
Thread-static local-storage
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
using System.Threading;
public class MainClass
{
[ThreadStatic]
private static string threadStaticData = "Empty";
public static void Main()
{
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
threads[i] = new Thread(delegate(object j) {
threadStaticData = "thread no: " + j;
Console.WriteLine("[Thread{0}] = {1}", j, threadStaticData);
});
threads[i].Start(i);
}
foreach (Thread t in threads)
t.Join();
Console.WriteLine("[Master] after loop = {0}", threadStaticData);
}
}
[Thread0] = thread no: 0
[Thread1] = thread no: 1
[Thread2] = thread no: 2
[Master] after loop = Empty
Use LocalDataStoreSlot
/*
Book Accelerated C# 2005
* By Trey Nash
* ISBN: 1-59059-717-6
* 432 pp.
* Published: Aug 2006
* Price: $39.99
*/
using System;
using System.Threading;
public class MyClass
{
static MyClass() {
tlsSlot = Thread.AllocateDataSlot();
}
public MyClass() {
Console.WriteLine( "Creating MyClass" );
}
public static MyClass MyThreadDataClass {
get {
Object obj = Thread.GetData( tlsSlot );
if( obj == null ) {
obj = new MyClass();
Thread.SetData( tlsSlot, obj );
}
return (MyClass) obj;
}
}
private static LocalDataStoreSlot tlsSlot = null;
}
public class MainClass
{
private static void ThreadFunc() {
Console.WriteLine( "Thread {0} starting...",Thread.CurrentThread.GetHashCode() );
Console.WriteLine( "tlsdata for this thread is \"{0}\"", MyClass.MyThreadDataClass );
Console.WriteLine( "Thread {0} exiting", Thread.CurrentThread.GetHashCode() );
}
static void Main() {
Thread thread1 = new Thread( new ThreadStart(ThreadFunc) );
Thread thread2 = new Thread( new ThreadStart(ThreadFunc) );
thread1.Start();
thread2.Start();
}
}
Thread 3 starting...
Creating MyClass
tlsdata for this thread is "MyClass"
Thread 3 exiting
Thread 4 starting...
Creating MyClass
tlsdata for this thread is "MyClass"
Thread 4 exiting
Use thread-local storage
using System;
using System.Threading;
class MainClass
{
public static void SetError()
{
Random r = new Random();
Thread.SetData(Thread.GetNamedDataSlot("Number"), r.Next(100));
Thread.SetData(Thread.GetNamedDataSlot("Name") ,Thread.CurrentThread.Name);
Console.WriteLine("Number = " + Thread.GetData(Thread.GetNamedDataSlot("Number")));
Console.WriteLine("Name = " + Thread.GetData(Thread.GetNamedDataSlot("Name")));
}
public static void Main()
{
Thread.AllocateNamedDataSlot("Number");
Thread.AllocateNamedDataSlot("Name");
Thread t2 = new Thread(new ThreadStart(SetError));
t2.Name = "t2";
t2.Start();
Thread t3 = new Thread(new ThreadStart(SetError));
t3.Name = "t3";
t3.Start();
Thread.FreeNamedDataSlot("Number");
Thread.FreeNamedDataSlot("Name");
}
}
Number = 81
Name = t2
Number = 81
Name = t3