what is the best way to store some variable local to each thread?
You can indicate that static variables should be stored per-thread using the [ThreadStatic] attribute:
[ThreadStatic]
private static int foo;
If you use .Net 4.0 or above, as far as I know, the recommended way is to use System.Threading.ThreadLocal<T> which also gives lazy initialization as a bonus.
Other option is to pass in a parameter into the thread start method. You will need to keep in in scope, but it may be easier to debug and maintain.
Another option in the case that scope is an issue you can used Named Data Slots e.g.
//setting
LocalDataStoreSlot lds = System.Threading.Thread.AllocateNamedDataSlot("foo");
System.Threading.Thread.SetData(lds, "SomeValue");
//getting
LocalDataStoreSlot lds = System.Threading.Thread.GetNamedDataSlot("foo");
string somevalue = System.Threading.Thread.GetData(lds).ToString();
This is only a good idea if you can't do what James Kovacs and AdamSane described