Локальные переменные не будут иметь проблем с безопасностью потока.Безопасность потоков становится проблемой, когда между несколькими потоками существует общее состояние.В этой функции, так как вы передаете результат по значению (которое является значением по умолчанию для примитивных типов, таких как строки, целые числа, десятичные числа), безопасность потока не является проблемой, поскольку нет общего состояния.Объекты, с другой стороны, передаются по ссылке, и безопасность потоков может стать проблемой.
Вот классический пример.Значение _unsafe должно быть 10000, поскольку у вас есть 100 потоков, которые увеличивают переменную _unsafe в 100 раз, но это может не произойти при запуске программы.Это потому, что значение может быть прочитано одним потоком, который выполняет свои вычисления, а затем, пока он выполняет свои вычисления, значение переменной будет увеличиваться другим потоком.Это называется состоянием гонки и этого стоит избегать.Вот отличная электронная книга о потоках, которая охватывает все темы, которые вам нужно знать.
http://www.albahari.com/threading/
public class TestThreading(){
private static int _unsafe = 0;
public static void main(string[] args){
for(int i =0; i<100;i++){
ThreadPool.QueueUserWorkItem(PerformIncrement);
}
}
public static void PerformIncrement(){
for(int i=0;i <100;i++){
_unsafe++;
}
}
}
Вот еще один небезопасный пример использования объектов.Это та же проблема, что и в предыдущем примере, поскольку несколько потоков работают с одним и тем же фрагментом данных (в данном случае это переменная класса unsafe)
public class TestThreading2(){
public int unsafe = 0;
public static void main(string[] args){
TestThreading2 objectUnsafe = new TestThreading2();
for(int i=0;i <100;i++){
Thread t = new Thread (PerformIncrement);
t.Start (objectUnsafe);
}
}
public static void PerformIncrement(object referenceParameter){
var objectReference = (TestThreading2) referenceParameter;
for(int i=0;i <100;i++){
objectReference.unsafe++;
}
}
}